[英]Pipe input/output to a process
我的管道工作有些困難。 我有以下代碼:
/* 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。
如果管道中沒有要讀取的數據,則PeekNamedPipe
將阻塞。 您將必須使用異步/非阻塞I / O。
參考: 異步IO
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.