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()ブロックします。

ここに投稿するには大きすぎる大規模なマルチスレッド アプリケーションの一部であるため、コードを大幅に簡略化しました。この問題を解決するために私からの詳細が必要な場合は、ここに投稿してください。要求された詳細を追加します。

よろしくお願いします。

4

1 に答える 1

1

PeekNamedPipeパイプに読み取るデータがない場合はブロックされます。非同期/ノンブロッキング I/O を利用する必要があります。

参照:非同期IO

于 2012-08-16T10:03:19.517 に答える