簡體   English   中英

將管道輸入/輸出到流程

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM