main()
{
printf( "%d\n" , 1/fork() );
}
通过运行这个应用程序,我的输出是:0。
我知道父 fork 的值为 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
以了解涉及哪些系统调用和信号。