vfork 在 linux 上的运行结果与 APUE 上描述不一致, 大家帮忙看看?

2015-04-06 23:05:42 +08:00
 herozem

代码如下:

#include "include/apue.h"

int glob = 6; /* external variable in initialized data */

int main(void)
{
  int var; /* automatic variable on the stack */
  pid_t pid;

  var = 88;
  printf("before fork\n");

  if ((pid = fork()) < 0) {
    err_sys("fork error");
  } else if (pid == 0) {
    /* child */
    glob++;
    var++;
    _exit(0);
  } 

  printf("pid = %d, glob = %d, var = %d\n", getpid(), glob, var);
  exit(0);
}

运行结果:

$ ./a.out 
before fork
pid = 3317, glob = 6, var = 88

APUE(第二版)第177页上说:
运行示例得到:

$ ./a.out 
before fork
pid = 3317, glob = 7, var = 89

是不是因为Linux采用了COW(copy on write)技术从而导致行为不像规定中的那样, 子进程在调用_exitexec之前都在父进程的空间中运行呢?

2477 次点击
所在节点    Linux
4 条回复
joyeblue
2015-04-06 23:17:39 +08:00
lz给的例子中的代码是调用是fork,而不是调用的vfork。
herozem
2015-04-06 23:26:25 +08:00
@joyeblue 都是cp惹得祸。。谢谢提醒
inevermore
2015-04-07 09:38:46 +08:00
。。
jemyzhang
2015-04-07 10:30:41 +08:00
子进程对父进程中的同名变量的更改,不会影响到父进程的值

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/181978

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX