2014-05-06 17 views
9

cmd_moreLàm cách nào để chuyển STDIN sang tiến trình con?

void WriteToPipe(void) 

// Read from a file and write its contents to the pipe for the child's STDIN. 
// Stop when there is no more data. 
{ 
    DWORD dwRead, dwWritten; 
    CHAR chBuf[BUFSIZE]; 
    BOOL bSuccess = FALSE; 
    char * name = malloc(100); 


fgets(name, 100, stdin); 


    bSuccess = WriteFile(g_hChildStd_IN_Wr, name, 10, &dwWritten, NULL); 
    if (!bSuccess) 
     ErrorExit(""); 

} 

void ReadFromPipe(void) 

// Read output from the child process's pipe for STDOUT 
// and write to the parent process's pipe for STDOUT. 
// Stop when there is no more data. 
{ 
    DWORD dwRead, dwWritten; 
    CHAR chBuf[BUFSIZE]; 
    BOOL bSuccess = FALSE; 
    HANDLE hParentStdOut = GetStdHandle(STD_OUTPUT_HANDLE); 


    bSuccess = ReadFile(g_hChildStd_OUT_Rd, chBuf, BUFSIZE, &dwRead, NULL); 
    if (!bSuccess || dwRead == 0) 
     return 100; 

    bSuccess = WriteFile(hParentStdOut, chBuf, 
     dwRead, &dwWritten, NULL); 
    if (!bSuccess) 
     return 101; 

} 

Các chính (không đầy đủ):

while (1) 
{ 
    Sleep(500); 

    ReadFromPipe(); 

    WriteToPipe(); 


} 

Tôi cố gắng để mở cmd như một quá trình con và để vượt qua các đầu vào cha mẹ vào dòng STDIN đứa trẻ, và hơn in STDOUT của trẻ.

Như bạn có thể thấy, nó hoạt động ở lần đầu tiên nhưng sau đó tôi nhận được điều này "nhiều hơn?" trở lại từ quá trình con (cmd) và sau đó nó bị mắc kẹt chờ đợi cho đầu ra.

Tại sao tôi nhận được điều này "nhiều hơn?" trở lại?

Điều đó có nghĩa là "nhiều hơn?"

+1

Hmm, hãy thử để có được xử lý đầu ra tiêu chuẩn ONCE trên toàn cầu. Ngoài ra, tránh ngủ và sử dụng một mutex, để các tập tin, mà bạn lạm dụng như đường ống, thực sự là an toàn bằng văn bản trước khi đọc/đọc một cách an toàn trước khi được viết lại). Và sử dụng trình gỡ rối. Có bằng cách nào đó một đoạn trả lời cho bất kỳ lệnh nào Bạn đã vượt qua, kết thúc bằng "Thêm?" Vì vậy, bạn có thể có vấn đề bộ nhớ về ranh giới, ghi đè lên một số công cụ. – icbytes

Trả lời

2

Cách duy nhất để chuyển hướng đầu vào gốc mà tôi đã tìm thấy - là tạo một chuỗi bổ sung. Các thuật toán phổ biến là:

  1. Tạo ống - (hPipeRead, hPipeWrite)
  2. Tạo child process với tiêu chuẩn đầu vào - hPipeRead
  3. Tạo chủ đề mới trong quá trình cha mẹ được đọc GetStdHandle(STD_INPUT_HANDLE) và đang viết đệm đọc cho hPipeWrite ngay. Chủ đề được hoàn thành khi stdInput kết thúc.
  4. quá trình Chánh đang chờ chủ đề thêm

Bằng cách này được mô tả trong Microsoft support article.

Các vấn đề liên quan