popen()を使用してパイプを作成していますが、プロセスはサードパーティのツールを呼び出していますが、まれに終了する必要があります。
::popen(thirdPartyCommand.c_str(), "w");
例外をスローしてスタックをアンワインドすると、アンワインドはサードパーティのプロセスでpclose()を呼び出そうとしますが、その結果は不要になります。ただし、pclose()は、Centos 4で次のスタックトレースでブロックされるため、返されません。
#0 0xffffe410 in __kernel_vsyscall ()
#1 0x00807dc3 in __waitpid_nocancel () from /lib/libc.so.6
#2 0x007d0abe in _IO_proc_close@@GLIBC_2.1 () from /lib/libc.so.6
#3 0x007daf38 in _IO_new_file_close_it () from /lib/libc.so.6
#4 0x007cec6e in fclose@@GLIBC_2.1 () from /lib/libc.so.6
#5 0x007d6cfd in pclose@@GLIBC_2.1 () from /lib/libc.so.6
pclose()の呼び出しを強制的に成功させてから呼び出す方法はありますか?プログラムで、pclose()が成功するのを待ってプロセスがハングアップするのを回避できます。これは、 popen()されたプロセスとその作業を破棄したいですか?
ファイルを閉じる前に、なんらかの方法でファイルの終わりをpopen()されたファイル記述子に書き込む必要がありますか?
サードパーティのソフトウェアがそれ自体をフォークしていることに注意してください。pclose()がハングした時点で、4つのプロセスがあり、そのうちの1つは機能していません。
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
abc 6870 0.0 0.0 8696 972 ? S 04:39 0:00 sh -c /usr/local/bin/third_party /home/arg1 /home/arg2 2>&1
abc 6871 0.0 0.0 10172 4296 ? S 04:39 0:00 /usr/local/bin/third_party /home/arg1 /home/arg2
abc 6874 99.8 0.0 10180 1604 ? R 04:39 141:44 /usr/local/bin/third_party /home/arg1 /home/arg2
abc 6875 0.0 0.0 0 0 ? Z 04:39 0:00 [third_party] <defunct>