2012-08-16 160 views
0

我的管道工作時遇到一些困難。我有以下代碼:管道輸入/輸出到過程

/* Set security attributes */ 
sa.nLength = sizeof(SECURITY_ATTRIBUTES); 
sa.bInheritHandle = TRUE; 
sa.lpSecurityDescriptor = NULL; 

if (CreatePipe(&Rread, &Rwrite, &sa, 0) == 0 || SetHandleInformation(Rread, HANDLE_FLAG_INHERIT, 0) == 0 || CreatePipe(&Wread, &Wwrite, &sa, 0) == 0 || SetHandleInformation(Wwrite, HANDLE_FLAG_INHERIT, 0) == 0) 
{ 
    /* Error */ 
} 


/* Set process information */ 
si.dwFlags = STARTF_USESTDHANDLES; 
si.hStdOutput = Rwrite; 
si.hStdError = Rwrite; 


if (CreateProcess(NULL, argsCasted->cmd, NULL, NULL, TRUE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi) == 0) 
{ 
    /* Error */ 
} 


for (;;) 
{ 
    PeekNamedPipe(Rread, NULL, 0, &a, NULL, NULL); 

    if (a > 0) 
    { 
     /* Write output somewhere... */ 
    } 

    if (a == 0 && GetExitCodeProcess(pi.hProcess, &c) != 0 && c != STILL_ACTIVE) break; 

    Sleep(50); 
} 


    /* CloseHandles... */ 

    /* Free stuff... */ 

現在,當我添加si.hStdInput = Wread;(這樣我可以把輸入的過程),PeekNamedPipe()塊。

我簡化了很多代碼,因爲它是大型多線程應用程序的一部分,它太大而無法在此處發佈。如果有人需要我提供更多的細節來解決這個問題,請在這裏發佈,我將添加所需的細節。

在此先感謝 Jori。

回答

1

PeekNamedPipe將阻塞管道中沒有數據要讀取。您將不得不使用異步/非阻塞I/O。

參見:asynchronous IO

+0

是的,我知道,但是當我加入時纔會發生:si.hStdInput = Wread ;?爲什麼? – Jori 2012-08-16 10:39:30

+1

@Jori:最可能的原因是外部程序的行爲有所不同,具體取決於它是否具有有效的標準輸入句柄。你是如何初始化'si'的? – 2012-08-16 21:43:42

+0

'STARTUPINFO si = sizeof(STARTUPINFO);' – Jori 2012-08-17 08:33:30