2012-11-05 1 views
8

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

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


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

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

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

+0

Я не пошел и не посмотрел на источник, поэтому я не отправляю это как ответ, но я был бы удивлен, если бы у системы не хватало памяти. – Gilles

+0

@ Gilles - «Из памяти» заставляет Perl выпускать «die» вместо coredump/crash? Я бы предположил, что позже, но не обязательно – DVK

+0

@ Gilles - [если бы у нас было место, где мы могли бы задать вопросы программирования ...] (http://stackoverflow.com/questions/13243637/is-there-a-standard -way-за жемчужно-на-себя-когда-это работает, из-за нехватки памяти). Посмотрим, что узнает SO мудрость. – DVK

ответ

6

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

источник: 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

Согласно документации, "паника: ребенок POPEN ERRNO читать" означает "раздвоенный ребенок вернулся непонятное сообщение о его егто".

Explanation of panic messages in Perl:

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

+0

из моего чтения источника, это произойдет только в том случае, если 1) выполняется exec(), выполняемое дочерним элементом, и 2) ребенок не может отправить 4 (возможно, 8) байта обратно родительскому каналу через канал. – ErikR

0

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

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

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

См. Мой комментарий к Брайану Агнью. Это не то, о чем я просил. – DVK

1

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

+0

«с ожиданием» - есть ли для этого техническая основа? Если вы посмотрите на ответ j.w.r., ваше заявление кажется совершенно неправильным. – DVK

+0

Мне было бы интересно узнать, сколько модулей CPAN пытается поймать исключение, созданное 'system'. Дело не в том, что этого не может быть, а в том, что вы обычно можете использовать 'system()' с ожиданием, что он не будет генерировать исключение. – ErikR

0

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

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

system('abcd');  # 'abcd' is not recognized... [Win32 message] 
say "I'm not dead."; # always prints 
+0

«Я предполагаю, что вы говорите о реализации самой системной функции, а не о том, что вызвано вызовом». - исправьте – DVK