main()
{
printf( "%d\n" , 1/fork() );
}
このアプリを実行すると、出力は0になります。
親フォークの値はnumberであり、Sonの値は0であることを私は知っています。
では、1/0を除算するのに問題がないのはなぜですか?
実際には、1/0算術例外が発生しますが、コンソールに出力されません。
コアファイルのサイズを無制限に設定すると、コアファイルが表示されます
$ ulimit -c unlimited
そして、算術例外を確認できるgdbを使用します
$ gdb a.out core
コンパイラはコードをより基本的なステップに変換しています
-fdump-tree-all
(オプションを GCC に渡すか、 MELTグラフィカルプローブを使用して、いくつかの中間 GCC 表現を調べることができます)
基本的に、コンパイラはコードを次のようなものに変換しています
int main()
{
int t1 = fork();
int t2 = 1 / t1;
printf("%d\n", t2);
}
したがって、 (子プロセスで) t1
getsの場合0
、への代入t2
は未定義の動作であり、通常はゼロによる除算(つまりSIGFPE
非同期シグナル)でクラッシュし、printf
に到達しません。
おそらく、クラッシュしないゼロ除算を行うことができるPowerPCプロセッサでは、(まだ未定義の)動作は異なるでしょう。
strace -f
ところで、どのようなシステムコールとシグナルが関与しているかを理解するために、プログラムを実行する必要があります。