当我们在c中使用fork时,进程之间是否共享数据?

mir*_*899 1 c stack gcc fork

在这个C程序中,数据不在进程即父进程和子进程之间共享.child拥有它自己的数据,而parent拥有它自己的数据,但指针显示两个进程的相同地址.它是如何在后台完成的?fork是否生成相同数据的副本?如果是这样,那么我们对两个进程都有相同的指针地址.或者是由于为每个进程复制的静态分配数据而且每个进程的数据是独立的?我想知道它是如何完成的?

#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>

int main()
{
    //Static Array
    int X[] = {1,2,3,4,5};
    int i, status;

    //The fork call
    int pid = fork();

    if(pid == 0) //Child process
    {
        //Child process modifies Array
        for(i=0; i<5; i++)
            X[i] = 5-i;
        //Child prints Array
        printf("Child Array:\t");
        for(i=0; i<5; i++)
            printf("%d\t", X[i]);
        printf("\nArray ptr = %p\n", X);
     }
     else //Parent process
     {
        // Wait for the child to terminate and let 
        // it modify and print the array
        waitpid(-1, &status, 0);

        //Parent prints Array
        printf("Parent Array:\t");
        for(i=0; i<5; i++)
           printf("%d\t", X[i]);
        printf("\nArray ptr = %p\n", X);
        }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是程序的输出.

 1  Child Array:    5   4   3   2   1   
 2  Array ptr = 0x7fff06c9f670
 3  Parent Array:   1   2   3   4   5   
 4  Array ptr = 0x7fff06c9f670
Run Code Online (Sandbox Code Playgroud)

当子进程修改数组时,它也应该修改父进程的数据.后台发生了什么?

Som*_*ude 6

当您fork进行新进程时,新子进程是父进程的副本.这就是指针等等的原因.由于虚拟内存的奇迹,两个进程可以拥有相同的内存映射,但仍然使用不同的内存.