fork()期间重复的段?

时间:2010-11-27 07:16:23

标签: c unix memory stack fork

我研究过,在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'。这意味着父进程的堆栈也会被复制到子进程中。

请告诉我这个的原因并纠正我,如果我的理解是错误的。

2 个答案:

答案 0 :(得分:2)

您应该再次检查docsfork创建“调用进程的精确副本”。不可否认,有很多例外,但堆栈不是其中之一。

此外,如果堆栈没有重复,那么从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