我研究过,在fork中,父进程的数据和代码段被复制到子进程中。
请参阅下面的程序。
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()
中声明。子进程应仅在fork()
期间获取父进程的代码和数据段的副本,而不是堆栈。但是当我运行程序时,我可以看到子进程也能够访问变量'a'。这意味着父进程的堆栈也会被复制到子进程中。
请告诉我这个的原因并纠正我,如果我的理解是错误的。
答案 0 :(得分:2)
您应该再次检查docs。 fork
创建“调用进程的精确副本”。不可否认,有很多例外,但堆栈不是其中之一。
此外,如果堆栈没有重复,那么从fork
检查返回值(几乎总是堆栈变量)的非常常见的习惯用法(也在代码中使用)将会失败。除非堆栈(包括堆栈指针)重复,否则 不会是pid
的堆栈位置。
答案 1 :(得分:2)
这不是一个好的测试 - 正如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 -o x x.c
pandora:~/tmp$ ./x
In parent a = 6
pandora:~/tmp$ In child a = 5