我正在使用popen()創建管道,並且該進程正在調用第三方工具,在某些罕見情況下,我需要終止該工具。如何強制文件描述符關閉以便pclose()不會被阻塞?
::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 [email protected]@GLIBC_2.1() from /lib/libc.so.6
#3 0x007daf38 in _IO_new_file_close_it() from /lib/libc.so.6
#4 0x007cec6e in [email protected]@GLIBC_2.1() from /lib/libc.so.6
#5 0x007d6cfd in [email protected]@GLIBC_2.1() from /lib/libc.so.6
有沒有什麼辦法來強制調用函數,pclose()是調用它之前的成功,所以我可以編程方式避免這種情況我的進程的情況越來越多,等待pclose()成功時,它永遠不會因爲我已經停止向popen()ed進程提供輸入並希望拋棄它的工作而成功。
在試圖關閉它之前,我應該以某種方式將文件末尾寫入popen()ed文件描述符?
請注意,第三方軟件本身是分叉的。在這裏pclose函數()已經掛點,有四道工序,其中之一是解散:
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>
不能保證我是唯一運行這個子進程的人,但是,給孩子的參數會提供一個唯一的簽名,那足夠了嗎? – WilliamKF
對於整潔的人,你是否建議用fork(),pipe()和execve()替換popen()/ pclose()? – WilliamKF
有沒有一個例子可以指出整潔的人會如何近乎完成? – WilliamKF