私は匿名パイプを使用して、stdinとstdoutを使用してthis exampleのように生成されたサブプロセスと通信しようとしています。これまでのところ、WriteFile()を使用して通信し、PeekNamedPipe()とReadFile()を使用してデータを読み取ります。人生は素晴らしい。Win32:匿名継承パイプはサブプロセス出口で閉じない
しかし、サブプロセスが予期せず終了したときに、WriteFile()への親プロセス呼び出しが、パイプが閉じていることを示す任意の種類のエラー状態を返すようには見えず、親プロセスがうんざりし続ける私はパイプの内部バッファーをオーバーフローさせて永遠にブロックするまでデータを書きます。
マイセットアップコードは次のようになります。
// Set up pipes
SECURITY_ATTRIBUTES sec_attrs;
memset(&sec_attrs, 0, sizeof(SECURITY_ATTRIBUTES));
sec_attrs.nLength = sizeof(SECURITY_ATTRIBUTES);
sec_attrs.bInheritHandle = TRUE;
sec_attrs.lpSecurityDescriptor = NULL;
if (!CreatePipe(&midi_process_in_reader, &midi_process_in_writer, &sec_attrs, 0))
{
DEBUGOUT("Could not initialize midiproc stdin");
return false;
}
if (!SetHandleInformation(midi_process_in_writer, HANDLE_FLAG_INHERIT, 0))
{
DEBUGOUT("Could not disinherit midiproc stdin");
return false;
}
if (!CreatePipe(&midi_process_out_reader, &midi_process_out_writer, &sec_attrs, 0))
{
DEBUGOUT("Could not initialize midiproc stdout/stderr");
return false;
}
if (!SetHandleInformation(midi_process_out_reader, HANDLE_FLAG_INHERIT, 0))
{
DEBUGOUT("Could not disinherit midiproc stdin");
return false;
}
// Launch the subprocess
PROCESS_INFORMATION proc_info;
memset(&proc_info, 0, sizeof(proc_info));
STARTUPINFO startup_info;
memset(&startup_info, 0, sizeof(startup_info));
startup_info.cb = sizeof(startup_info);
startup_info.hStdInput = midi_process_in_reader;
startup_info.hStdOutput = midi_process_out_writer;
startup_info.dwFlags = STARTF_USESTDHANDLES;
BOOL ok = CreateProcess(TEXT(module), TEXT(cmdline), NULL, NULL, TRUE,
CREATE_NEW_CONSOLE, NULL, NULL, &startup_info, &proc_info);
私は一例であり、私のコードの間で見ることができる唯一の違いは、私は標準エラー出力をフックアップしていないということです - 私はfprintfのデバッグのために周りにそれを維持したいです。
サブプロセスがゾンビになって完全に生きていて、ハンドルを開いたままにしておくことはできますが、スタンダードを読み取ることはできないため、おそらく何らかの「ハートビート」メッセージが必要になるでしょう。物事を別の方法でくさびる。しかし、私はWindows上の匿名パイプの理解に何か不足していないことを確認したい。