C语言 vfork() 和 gcC语言 O2 似乎有一个错误的结果



我从APUE获取了代码。在 Ubuntu 12.04 中,如果我在没有任何优化的情况下使用 gcc,我将得到与本书相同的结果:

pid = 4122, glob = 7, var = 89.

如果我使用 gcc -O2,那么变量将是 88。这是因为 gcc 优化会对 vfork() 做一些事情吗?

#include "apue.h"
int glob = 6;
int
main(void)
{
  int var;
  pid_t pid;
  var = 88;
  printf("before vforkn");
  if ((pid = vfork()) < 0) {
    err_sys("vfork error");
  } else if ( pid ==0) {
    glob++;
    var++;
    _exit(0);
  }
  printf("pid = %d, glob = %d, var = %dn", getpid(), glob, var);
  exit(0);
}

从规范中,孩子代码中的这两行

    glob++;
    var++;

挑起未定义的行为。

从 Linux man vfork

(来自 POSIX.1) [...] 如果进程由 vfork() 要么修改除 pid_t 型变量以外的任何数据 用于存储来自 vfork() 的返回值 [...]

值得注意的是,vfork()在POSIX的先前版本中被"标记为过时"(请参阅上面的POSIX链接),并在第7期(POSIX.1-2008)中从POSIX中删除:

建议应用程序使用 fork() 函数而不是此函数。

vfork() 函数以前未被充分指定。

相关内容

最新更新