0

Windows の c++ cmd.exe の子プロセスを作成しましたが、パイプを読み取っているときにスタックします。

HANDLE parent = GetStdHandle(STD_OUTPUT_HANDLE);
char buffer[BUFSIZE];
DWORD read, written;
BOOL b = true;

for(;;)
{
    b = ReadFile(g_hChildStd_OUT_Rd, buffer, BUFSIZE, &read, NULL);
    if(! b || read == 0) break;

    b = WriteFile(parent, buffer, read, &written, NULL);
    if(! b) break;
}

コンソールに cmd.exe からの出力を出力しますが、このループでハングします。ループを壊さない理由を理解する必要があるだけです

4

2 に答える 2

1

書かれたコードは、パイプの書き込み側が閉じられたときに終了する必要があります。これは、パイプへの最後のハンドルが閉じられたときに発生します。子プロセスが終了すると、パイプの書き込み側へのハンドルが自動的に閉じられます。

私が確信できるほど十分なコードを示していませんが、最も可能性の高い原因は、パイプの書き込み側へのハンドルを閉じていないことです。サブプロセスを起動した後にハンドルを閉じると、コードが機能するはずです。

于 2012-08-10T21:52:39.747 に答える
0

ReadFile と WriteFile は常に成功し、read が 0 になることはないため、b は常に true であるため、ループは無限です。

于 2012-08-10T18:54:22.950 に答える