2
main()
{
    printf( "%d\n" , 1/fork() );
}

このアプリを実行すると、出力は0になります。

親フォークの値はnumberであり、Sonの値は0であることを私は知っています。

では、1/0を除算するのに問題がないのはなぜですか?

4

2 に答える 2

7

実際には、1/0算術例外が発生しますが、コンソールに出力されません。

コアファイルのサイズを無制限に設定すると、コアファイルが表示されます

$ ulimit -c unlimited

そして、算術例外を確認できるgdbを使用します

$ gdb a.out core
于 2013-01-27T11:35:07.373 に答える
1

コンパイラはコードをより基本的なステップに変換しています

-fdump-tree-all(オプションを GCC に渡すか、 MELTグラフィカルプローブを使用して、いくつかの中間 GCC 表現を調べることができます)

基本的に、コンパイラはコードを次のようなものに変換しています

 int main()
 {
   int t1 = fork();
   int t2 = 1 / t1;
   printf("%d\n", t2);
 }

したがって、 (子プロセスで) t1getsの場合0、への代入t2は未定義の動作であり、通常はゼロによる除算(つまりSIGFPE非同期シグナル)でクラッシュし、printfに到達しません。

おそらく、クラッシュしないゼロ除算を行うことができるPowerPCプロセッサでは、(まだ未定義の)動作は異なるでしょう。

strace -fところで、どのようなシステムコールとシグナルが関与しているかを理解するために、プログラムを実行する必要があります。

于 2013-01-27T12:47:23.420 に答える