以下のperlコードスニペットについての良い説明をしてください。私はグーグルからいくつかのアイデアを得たが、まだ基本的な混乱がたくさんある。あなたはそれに
$exit_value = $? >> 8;
$signal_num = $? & 127;
$dumped_core = $? & 128;
以下のperlコードスニペットについての良い説明をしてください。私はグーグルからいくつかのアイデアを得たが、まだ基本的な混乱がたくさんある。あなたはそれに
$exit_value = $? >> 8;
$signal_num = $? & 127;
$dumped_core = $? & 128;
The Docを引用:
$?
最後のパイプクローズ、バックティック( ``)コマンド、 wait()またはwaitpid()、またはsystem()オペレータからの呼び出しが成功したステータス。 これは、従来のUnix wait()システムコールから返された16ビットのステータスワードです(そうでない場合は、そのように見えます)。したがって、サブプロセスの終了値 は本当に($?>> 8)で、$? & 127は となります。 & 128レポート コアダンプがあったかどうか。
>> 8
は、16ビットワードの上位バイトを示します。
& 127
は実質的に& 0b01111111
と同じで、その語の下位7ビット部分を示します。
& 128
は、基本的に結果の8番目のビットをチェックしている& 0b10000000
と同じです。
を小さなノートを提供できる場合には、大きな助け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
を参照してください。
use POSIX qw(WEXITSTATUS WIFEXITED);
if(WIFEXITED($?)) {
print "The exit status was ", WEXITSTATUS($?), "\n";
}
もWIFSIGNALED
とWTERMSIG
を参照してください。
別の有用なCマクロ子供がコア・ダンプを生成した場合
WCOREDUMP(status)
戻り真(加え重視した)としてGNU Cライブラリに記載
WCOREDUMP
、です。このマクロは、WIFSIGNALEDがtrueを返す場合にのみ使用してください。 このマクロは、POSIX.1-2001で指定されておらず、一部のUnix実装(AIX、SunOSなど)では利用できません。これを囲むのは&hellipのみです。#endif
。 version 5.10.0以来
、$?
の値をその計算でperlのincludes WCOREDUMP
perlvarに記載されているようなマクロは、システム上で利用可能な場合:
したがって、サブプロセスの終了値が本当に
($?>> 8)
です$? & 127
は、プロセスが枯れた信号があればそれを示し、$? & 128
はコアダンプがあるかどうかを報告します。
私は '$?この最後の8ビットは通常符号付きの値であるため、 '' 8 '') ''($ exit)= unpack( "c"、pack( "S"、($?>> 8))) '。 – Ouki
@Ouki、 'pack" S "'は16ビットの値を期待していますが、 '$? >> 8は16ビットです(3バイトの長さになります)。しかし、それは1秒間だと言うことができます。次に、16ビットのうち8ビットをアンパックするだけで、数値が破損します。そのコードは間違っています。 – ikegami
これはありませんが、 'pack(" c "、($?>> 8))'は警告を表示します。 – Ouki