Ошибка в документации perlipc?

Я пытаюсь разобраться в том, что я вижу в документации 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}.

Что я неправильно понимаю?

6
задан Ovid 4 May 2012 в 22:27
поделиться