Я пытаюсь разобраться в том, что я вижу в документации perlipc.
Если вы пишете в канал, вы также должны перехватывать SIGPIPE. В противном случае, подумайте о том, что происходит, когда вы запускаете канал для команды, которая не существует: open(), по всей вероятности, завершится успешно (это только отражает успех fork()), но тогда ваш вывод будет потерпеть неудачу - эффектно. Perl не может знать, сработала ли команда потому что ваша команда на самом деле выполняется в отдельном процессе, чей exec() мог завершиться ошибкой. Поэтому, пока читатели фиктивных команд вернуть только быстрый конец файла, сработает команда записи в фиктивную сигнал, к которому им лучше быть готовыми. Подумайте:
open(FH, "|bogus") or die "can't fork: $!";
print FH "bang\n" or die "can't write: $!";
close FH or die "can't close: $!";
Это не взорвется до закрытия, и оно взорвется с СИГПАЙП. Чтобы уловить это, вы можете использовать это:
$SIG{PIPE} = 'IGNORE';
open(FH, "|bogus") or die "can't fork: $!";
print FH "bang\n" or die "can't write: $!";
close FH or die "can't close: status=$?";
Если я правильно понимаю, там говорится, что первая версия, вероятно, не умрет до окончательного закрытия.
Однако этого не происходит в моей системе OS X (версии Perl с 5.8.9 по 5.15.9). Он взрывается на open
с сообщением «невозможно разветвить: нет такого файла или каталога» независимо от того, есть ли у меня там строка $SIG{PIPE}.
Что я неправильно понимаю?