從FreeBSD上我打開幾個子進程與IPC::Open2::open2()
,傳遞給每一個進程中的「參數」,通過它的標準輸入一個Perl腳本(也許我應該關閉後,這個標準輸入),也是我做的事:Perl open2()與SIGCHLD一起死鎖?
sub handle_SIGCHLD {
for(;;) {
my $kid = waitpid(-1, WNOHANG);
break if $kid == 0;
my $KidOutputFD = ...; # I stored the kid's output pipe FD earlier in the program
my $KidOutput = read_file($KidOutputFD); # use File::Slurp
# process $KidOutput
}
}}
$SIG{'CHLD'} = \&handle_SIGCHLD;
現在問題:像這樣的代碼會導致死鎖嗎?我更喜歡讀取孩子的輸出,而不是在它到達時,但是當它終止讀取整個輸出時;可能會導致問題嗎?
此外,我通過stdin傳遞給孩子的「參數」可能是一個很長的字符串。我將通過一個print
運算符將整個字符串傳遞給子標準符的FD。在將參數寫入腳本的過程中,它可以阻止嗎?
還有什麼我應該做的,以確保沒有死鎖的?也許我應該處理SIGPIPE? (我不喜歡這樣做,太多的工作簡單,子進程將輸入字符串轉換爲輸出字符串是否有一個更簡單的方法?)
另外請注意,我跨越多個子進程。有時我會等一個進程終止,有時候我會用SIGTERM殺死一個子進程。
更具體的問題:可以寫入PIPE(這是在兩側打開,並且不會被關閉)塊(如果對方沒有讀它)?
'waitpid'可以返回-1,這樣就可以將這段代碼放入一個無限循環 – mob