在fork()中重复的段?

我已经研究了在fork中,父进程的数据和代码段被复制到subprocess中。

请看下面的程序。

int main() { int a = 5; pid_t pid; pid = fork(); if(pid == 0) { printf("In child a = %d",a); } else { printf("In parent a = %d",a); } return 0; } 

这里的a在父进程的栈段中,因为它在函数main()被声明。 subprocess应该只获得父进程的代码和数据段的副本,而不是fork()期间的栈。 但是当我运行该程序时,我可以看到subprocess也能够访问variables“a”。 这就意味着父进程的堆栈也被复制到subprocess中。

请告诉我这个理由,如果我的理解错误,请纠正我。

你应该再次检查文档 。 fork创建一个“调用过程的精确副本”。 诚然,有很多例外,但堆栈不是其中之一。

另外,如果堆栈没有被复制,检查fork的返回值(几乎总是一个堆栈变量)的非常常见的习惯用法(也用于你的代码中)将会失败。 除非堆栈(包括堆栈指针)被复制,否则不会有堆栈的位置。

这不是一个好的测试,正如Matthew指出的那样,fork()会给出父进程的精确副本,包括堆栈(否则子进程将无法从此函数返回)。

一个更好的测试是修改父母的“a”并在孩子中观察它,如下所示:

 #include <stdio.h> #include <unistd.h> int main() { int a = 5; pid_t pid; pid = fork(); if (pid == 0) { sleep(5); printf("In child a = %d\n",a); } else { a++; printf("In parent a = %d\n",a); } return 0; } 

结果是正确的:

 pandora:~/tmp$ cc -ox xc pandora:~/tmp$ ./x In parent a = 6 pandora:~/tmp$ In child a = 5