Может ли системный вызов Perl () когда-нибудь умереть?

Может system() звонок может когда-либо die в Perl 5?

(другими словами, для того, чтобы обеспечить 100% защиту от сбоев программы, которая делает system() звонить, нужно ли его обернуть в eval блокировать, или это совершенно не нужно?)


Я не нашел ни одного упоминания об этой возможности в perldoc system, но не нашел точного "этот звонок никогда не умрет".

ПРИМЕЧАНИЕ: здесь речь идет об основном CORE Perl, нет autodie или любой другой пользовательский модуль, который будет иметь аналогичный эффект. Кроме того, предположим, нет ALRM сигнал был установлен, или любой другой пользовательский обработчик сигнала в этом отношении.

Я предполагаю, что все версии Perl 5.* ведут себя одинаково, но если нет, то ответ на вопрос 5.8 будет принят.

4 ответа

Решение

Если моя интерпретация источника неверна, это выглядит как возможность:

Источник: Perl 5.16.2 (тоже проверено на 5.8.8), файл: pp_sys.c, строка: 4224 внутри PP(pp_system) кодовый блок:

if (n != sizeof(int))
  DIE(aTHX_ "panic: kid popen errno read, n=%u", n);

DIE является Perl_die(pTHX_ const* pat, ...) объявлено в util.c

Согласно документации, "panic: kid popen errno read" означает "раздвоенный ребенок вернул непонятное сообщение о своем errno".

Объяснение panic сообщения в Perl:

Соглашение состоит в том, что, когда интерпретатор умирает с внутренней ошибкой, сообщение начинает "панику: ". Исторически многие сообщения о панике были краткими фиксированными строками, что означает, что значения вне диапазона, которые вызвали панику, теряются. Теперь мы пытаемся сообщить об этих значениях, поскольку такая паника может не повторяться, и исходное сообщение об ошибке может быть единственной диагностикой, которую мы получаем, когда пытаемся найти причину.

Ты можешь позвонить system() с ожиданием, что он не будет бросать исключение. Там нет необходимости, чтобы обернуть его в eval блок.

system возвращает статус выхода из программы. Это означает, что в случае сбоя программы вызывающий скрипт Perl продолжается (см. Систему).

Тем не менее, сама программа все еще может убить вызывающий скрипт или даже привести к падению компьютера. Например, в Linux:

system 'killall', 'perl';
print "Alive\n";

Я предполагаю, что вы говорите о реализации system сама функция в отличие от того, что вызывается через вызов. (Очевидно, дочерний процесс не может вызвать die в контексте родителя, и даже это предполагает, что вызов кода Perl.)

Для окончательного ответа потребуются знания внутренних компонентов, но, учитывая, что попытка вызвать несуществующую программу не умирает, я не могу представить, что что-либо еще будет, либо:

system('abcd');      # 'abcd' is not recognized... [Win32 message]
say "I'm not dead."; # always prints
Другие вопросы по тегам