2012-03-01 15 views
10

以下のperlコードスニペットについての良い説明をしてください。私はグーグルからいくつかのアイデアを得たが、まだ基本的な混乱がたくさんある。あなたはそれに

$exit_value = $? >> 8; 
$signal_num = $? & 127; 
$dumped_core = $? & 128; 

答えて

12

The Docを引用:

$?

最後のパイプクローズ、バックティック( ``)コマンド、 wait()またはwaitpid()、またはsystem()オペレータからの呼び出しが成功したステータス。 これは、従来のUnix wait()システムコールから返された16ビットのステータスワードです(そうでない場合は、そのように見えます)。したがって、サブプロセスの終了値 は本当に($?>> 8)で、$? & 127は となります。 & 128レポート コアダンプがあったかどうか。

>> 8は、16ビットワードの上位バイトを示します。

& 127は実質的に& 0b01111111と同じで、その語の下位7ビット部分を示します。

& 128は、基本的に結果の8番目のビットをチェックしている& 0b10000000と同じです。

6

を小さなノートを提供できる場合には、大きな助けperldoc -f systemを参照してください:

if ($? == -1) { 
    print "failed to execute: $!\n"; 
} 
elsif ($? & 127) { 
    printf "child died with signal %d, %s coredump\n", 
     ($? & 127), ($? & 128) ? 'with' : 'without'; 
} 
else { 
    printf "child exited with value %d\n", $? >> 8; 
} 

$?セマンティクスがwaitシステムコールから取得され、man 2 waitを参照してください。

+0

私は '$?この最後の8ビットは通常符号付きの値であるため、 '' 8 '') ''($ exit)= unpack( "c"、pack( "S"、($?>> 8))) '。 – Ouki

+0

@Ouki、 'pack" S "'は16ビットの値を期待していますが、 '$? >> 8は16ビットです(3バイトの長さになります)。しかし、それは1秒間だと言うことができます。次に、16ビットのうち8ビットをアンパックするだけで、数値が破損します。そのコードは間違っています。 – ikegami

+0

これはありませんが、 'pack(" c "、($?>> 8))'は警告を表示します。 – Ouki

2
use POSIX qw(WEXITSTATUS WIFEXITED); 

if(WIFEXITED($?)) { 
    print "The exit status was ", WEXITSTATUS($?), "\n"; 
} 

WIFSIGNALEDWTERMSIGを参照してください。

別の有用なCマクロ子供がコア・ダンプを生成した場合

WCOREDUMP(status)

戻り真(加え重視した)としてGNU Cライブラリに記載WCOREDUMP、です。このマクロは、WIFSIGNALEDがtrueを返す場合にのみ使用してください。 このマクロは、POSIX.1-2001で指定されておらず、一部のUnix実装(AIX、SunOSなど)では利用できません。これを囲むのは&hellipのみです。 #endifversion 5.10.0以来

$?の値をその計算でperlのincludes WCOREDUMPperlvarに記載されているようなマクロは、システム上で利用可能な場合:

したがって、サブプロセスの終了値が本当に($?>> 8)です$? & 127は、プロセスが枯れた信号があればそれを示し、$? & 128はコアダンプがあるかどうかを報告します。

関連する問題