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。
是的,我知道,但是當我加入時纔會發生:si.hStdInput = Wread ;?爲什麼? – Jori 2012-08-16 10:39:30
@Jori:最可能的原因是外部程序的行爲有所不同,具體取決於它是否具有有效的標準輸入句柄。你是如何初始化'si'的? – 2012-08-16 21:43:42
'STARTUPINFO si = sizeof(STARTUPINFO);' – Jori 2012-08-17 08:33:30