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

通过运行这个应用程序,我的输出是:0。

我知道父 fork 的值为 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 回答