6

fork()を実行し、Perlで子が死ぬのを待つという簡単な例を考えてみましょう。

#!/usr/bin/perl

use strict;
use warnings;

if (fork() == 0) {
        exit(1);
}

waitpid(-1,0);

print $?;

Solaris 10でスクリプトを実行すると、次の結果が得られます。

$ perl test.pl
256

exit(2)子で行うと出力が。になるため、の値が上にシフトしているのではないかと思います512

私はこれがperlのwaitpidに文書化されているのを見つけることができないようです。これは私のシステムのバグですか、それとも何か間違ったことをしていますか?

4

2 に答える 2

24

これは、 perlvarのマニュアルページの$?セクションに記載されています。

つまり、実際の終了コードは$? >> 8です。

于 2010-05-25T22:36:57.450 に答える
2

子供は電話をかけることさえできなかったかもしれませんexit。そのため$?、パラメータだけでなく、より多くの情報をパックしexitます。

if    ( $? == -1  ) { die "Can't launch child: $!\n"; }
elsif ( $? & 0x7F ) { die "Child killed by signal ".( $? & 0x7F )."\n"; }
elsif ( $? >> 8   ) { die "Child exited with error ".( $? >> 8 )."\n"; }
else                { print "Child executed successfully\n"; }

これは、のドキュメントでより明確に文書化されてsystemいます。

于 2016-08-19T16:15:48.940 に答える