2

我从 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);
}
4

1 回答 1

3

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

    glob++;
    var++;

引发未定义的行为。

Linuxman vfork

来自 POSIX.1)[...] 如果由 vfork() 创建的进程修改了除用于存储来自 vfork() 的返回值的 pid_t 类型的变量以外的任何数据,则行为未定义 [...]

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

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

vfork() 函数以前未指定。

于 2013-12-21T08:00:30.173 回答