我研究过,在 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”。这意味着父进程的堆栈也以某种方式复制到子进程中。
请告诉我这样做的原因,如果我的理解有误,请纠正我。
最佳答案
你应该检查 docs再次。 fork
创建“调用进程的精确副本”。诚然,有很多异常(exception),但堆栈不是其中之一。
另外,如果堆栈没有被复制,检查 fork
的返回值(几乎总是一个堆栈变量)的非常常见的习惯用法(也用在您的代码中)将失败。除非堆栈(包括堆栈指针)被复制,否则 pid
不会堆栈位置。
关于c - fork() 期间重复的段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4290559/