8

Perl 5 でsystem()呼び出しはできますか?die

(言い換えると、system()呼び出しを行うプログラムを 100% クラッシュ防止するために、ブロックにラップする必要がありますevalか、それとも完全に不要ですか?)


でその可能性についての単一の言及を見つけられperldoc systemませんでしたが、正確な「この呼び出しは決して死ぬことはありません」も見つけられませんでした。

注: ここでの質問は基本的な CORE Perl に関するものであり、autodie同様の効果を持つ他のカスタム モジュールはありません。また、ALRMシグナルが設定されていないか、その他のカスタム シグナル ハンドラが設定されていないとします。

Perl 5.* のすべてのバージョンが同じように動作すると想定していますが、そうでない場合は、5.8 に関する回答をいただければ幸いです。

4

4 に答える 4

6

ソースの私の解釈が間違っていない限り、これは可能性のように見えます:

ソース: Perl 5.16.2 (5.8.8 もチェック済み)、ファイル: pp_sys.c、行:PP(pp_system)コード ブロック内の 4224:

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

DIEPerl_die(pTHX_ const* pat, ...)宣言されていますutil.c

ドキュメントによると、「panic: kid popen errno read」は、「分岐した子がその errno について理解できないメッセージを返した」ことを意味します。

panicPerl でのメッセージの説明:

慣例では、インタープリターが内部エラーで終了すると、メッセージは "panic: " で始まります。歴史的に、多くのパニック メッセージは簡潔な固定文字列でした。これは、パニックを引き起こした範囲外の値が失われることを意味します。このようなパニックは再現できない可能性があり、元のエラー メッセージが原因を見つけようとしたときに得られる唯一の診断になる可能性があるため、現在、これらの値を報告しようとしています。

于 2012-11-05T17:12:29.943 に答える
2

system()例外がスローされないことを期待して呼び出すことができます。evalブロックでラップする必要はありません。

于 2012-11-05T15:50:08.447 に答える
1

systemプログラムの終了ステータスを返します。これは、プログラムがクラッシュした場合、呼び出し元の Perl スクリプトが続行されることを意味します ( systemを参照)。

それでも、プログラム自体が呼び出し元のスクリプトを強制終了したり、コンピューターをクラッシュさせたりする可能性があります。たとえば、Linux では次のようになります。

system 'killall', 'perl';
print "Alive\n";
于 2012-11-05T15:42:44.483 に答える