2009-11-06 4 views
3

У меня есть следующая структура скрипта: скрипт A открывает PIPE на B, а B открывает PIPE на C. Таким образом, поток данных A-> B-> C. B улавливает SIGPIPE. Хотя открываются дескрипторы и 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 :: Выбрать и когда IN находится в $ бассейн-> can_read(), я прочитал от него с sysread(). Через секунду я записываю OUT с печатью. Также у меня есть сокет для прослушивания в пуле $, и клиенты могут подключиться к нему. Но я читаю только от клиентов. Я пишу только на OUT.

+2

Вы должны быть более ** более конкретными о том, что вы делаете и как вы это делаете. –

ответ

3

Согласно Wikipedia article, это означает, что С умер:

На POSIX-совместимых платформ, SIGPIPE это сигнал передается процессу, когда он пытается написать к трубе без процесса, подключенного к разъему другой конец.

+0

A умирает после B. – Lexsys

+0

Я обновил свой ответ. –

+0

Но почему OUT-> open() возвращает 1? И как я могу проверить, что С мертв другим? – Lexsys

3

Дескрипторы будут открыты даже после того, как процесс умер. Например, вы могли читать все, что написала программа, прежде чем она умерла.

Однако, если вы попытаетесь написать мертвую программу, она будет бросать SIGPIPE на вас.

Вы можете проверить, если дочерний процесс умер, ожидая от его PID:

waitpid($childpid, &WNOHANG); 

Если это возвращает 0, ребенок все еще работает.

Смежные вопросы