我从APUE获取了代码。在Ubuntu 12.04中如果我使用gcc而没有任何优化,我会得到与本书相同的结果:
pid = 4122, glob = 7, var = 89.
如果我使用gcc -O2,则var将为88。 这是因为gcc优化会对vfork()做什么吗?
#include "apue.h"
int glob = 6;
int
main(void)
{
int var;
pid_t pid;
var = 88;
printf("before vfork\n");
if ((pid = vfork()) < 0) {
err_sys("vfork error");
} else if ( pid ==0) {
glob++;
var++;
_exit(0);
}
printf("pid = %d, glob = %d, var = %d\n", getpid(), glob, var);
exit(0);
}
答案 0 :(得分:3)
从规范中,孩子代码中的那两行
glob++;
var++;
挑起未定义的行为。
(From POSIX.1)[...]如果创建过程,则行为未定义 vfork()修改除pid_t类型的变量之外的任何数据 用于存储vfork()[...]
的返回值
值得注意的是,vfork()
在之前版本的POSIX中是“标记为过时的”(请参阅上面的POSIX链接)并且是removed from POSIX with Issue 7 (POSIX.1-2008):
建议应用程序使用fork()函数代替此函数。
vfork()函数以前未被指定。