2009-11-06 84 views
3

我有以下腳本結構:腳本A在B上打開PIPE,B在C上打開PIPE。所以數據流是A-> B-> C。 B捕獲SIGPIPE。雖然描述符IN和OUT被打開:SIGPIPE在這種情況下意味着什麼?

$SIG{'PIPE'} = sub { 
$logger->info('caught PIPE signal.'); 
$logger->info("STDIN status: ".STDIN->opened()); 
$logger->info("STDOUT status: ".OUT->opened()); 
die; 
}; 

STDIN status: 1 
STDOUT status: 1 

我已經加入到$池IO ::選擇而當在pool-的$> can_read(),我從中讀出與sysread執行()。一秒鐘後,我會用打印機寫入OUT。另外我在$池中有一個偵聽套接字,客戶端可以連接到它。但我只從客戶處讀到。我只寫信給OUT。

+2

對於你在做什麼以及你是如何做的,你將不得不多做**更具體。 – 2009-11-06 14:17:59

回答

3

根據該Wikipedia article,這意味着C已死亡:

在POSIX兼容的平臺,SIGPIPE是發送到處理的信號時,它試圖寫入一個管道,而不連接到所述一個處理另一端。

+0

A死後B. – Lexsys 2009-11-06 14:32:29

+0

我已經更新了我的答案。 – 2009-11-06 14:52:37

+0

但爲什麼OUT-> opened()返回1?我怎麼能檢查C是死的另一種方式? – Lexsys 2009-11-06 14:57:10

3

描述符即使在該過程已經死亡後也會打開。例如,你可以繼續閱讀程序在死亡之前編寫的東西。

但是,如果您嘗試寫死程序,它會向您發出SIGPIPE。

您可以檢查一個子進程是死了等待其PID:

waitpid($childpid, &WNOHANG); 

如果返回0,孩子仍在運行。