带有gcc -O2的vfork()似乎有错误的结果。

时间:2013-12-21 07:05:36

标签: c linux gcc vfork

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

1 个答案:

答案 0 :(得分:3)

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

    glob++;
    var++;

挑起未定义的行为。

来自Linux man vfork

  

From POSIX.1)[...]如果创建过程,则行为未定义          vfork()修改除pid_t类型的变量之外的任何数据          用于存储vfork()[...]

的返回值

值得注意的是,vfork()在之前版本的POSIX中是“标记为过时的”(请参阅​​上面的POSIX链接)并且是removed from POSIX with Issue 7 (POSIX.1-2008)

  

建议应用程序使用fork()函数代替此函数。

     

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