2017-02-22 2 views
0

私は匿名パイプを使用して、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上の匿名パイプの理解に何か不足していないことを確認したい。

答えて

7

CreateProcess()に電話した後、midi_process_in_readermidi_process_out_writerを閉じなければなりません。あなたの問題は、 "継承されたパイプがサブプロセス出口で閉じない"ためではありません。それは、あなた自身のプロセスでパイプを閉じるのを忘れたからです。

関連する問題