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

在c中使用fork时,进程之间是否共享数据?,c,gcc,stack,fork,C,Gcc,Stack,Fork,在这个C程序中,数据不会在进程(即父进程和子进程)之间共享。子进程有自己的数据,父进程有自己的数据,但指针为两个进程显示相同的地址。它是如何在后台完成的?fork是否生成相同数据的副本?如果是这样,那么两个进程的指针地址是相同的。还是由于为每个进程复制静态分配的数据,并且每个进程的数据是独立的?我想知道是怎么做的 #include<stdio.h> #include<sys/types.h> #include<unistd.h> int main() {

在这个C程序中,数据不会在进程(即父进程和子进程)之间共享。子进程有自己的数据,父进程有自己的数据,但指针为两个进程显示相同的地址。它是如何在后台完成的?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;
}

当子进程修改数组时,它还应该修改父进程的数据。背景是什么

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

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

fork()
创建调用进程的副本,包括分配给它的所有内存

每个进程都有自己的地址空间,指针的值在该地址空间的上下文中。因此,在原始进程中打印某个变量的地址将得到与在派生进程中打印该地址相同的输出

然而,就操作系统而言,地址并不相等。操作系统负责确保每个进程都有自己的内存幻觉

进程之间有共享内存的方法(即一个进程写入共享内存,另一个进程看到)。但是,默认情况下不会发生这种情况,并且在主机操作系统的帮助下仍然会发生。

fork()
创建调用进程的副本,包括分配给它的所有内存

每个进程都有自己的地址空间,指针的值在该地址空间的上下文中。因此,在原始进程中打印某个变量的地址将得到与在派生进程中打印该地址相同的输出

然而,就操作系统而言,地址并不相等。操作系统负责确保每个进程都有自己的内存幻觉


进程之间有共享内存的方法(即一个进程写入共享内存,另一个进程看到)。但是,默认情况下不会发生这种情况,在主机操作系统的帮助下仍然会发生这种情况。

fork
创建父进程内存映像的精确副本(例外情况请参见手册页)。这称为写时复制(COW)叉。到目前为止,只有子级读取数据时,父级和子级都有相同的数据副本,但当子级写入时,会生成一个新副本,然后子级和父级都有各自数据的不同副本

fork
创建父进程内存映像的精确副本(例外情况请参见手册页)。这称为写时复制(COW)叉。到目前为止,只有子级读取数据,父级和子级都有相同的数据副本,但当子级写入时,会生成一个新副本,然后子级和父级都有不同的数据副本

谢谢,但我还有一个问题。如果我使用malloc来创建内存呢<代码>int*X=(int*)malloc(5*sizeof(int))当我在子进程中修改数组时,该更改在父数组中也可用。你能解释一下为什么要这样做吗@在
fork()
的调用也被复制而不是共享之前,Peterit无法使用
malloc()
查看分配给我的应答内存。
malloc()
的后续调用对于调用过程来说是唯一的,也不是共享的。谢谢,但我还有一个问题。如果我使用malloc来创建内存呢<代码>int*X=(int*)malloc(5*sizeof(int))当我在子进程中修改数组时,该更改在父数组中也可用。你能解释一下为什么要这样做吗@在
fork()
的调用也被复制而不是共享之前,Peterit无法使用
malloc()
查看分配给我的应答内存。
malloc()
的后续调用对于调用过程来说是唯一的,也不是共享的。谢谢,但我还有一个问题。如果我使用malloc来创建内存呢<代码>int*X=(int*)malloc(5*sizeof(int))当我在子进程中修改数组时,该更改在父数组中也可用。你能解释一下为什么要这样做吗@Joachim@mirfan899这是不可能发生的,一旦你分叉了内存映射和内容是相同的,因为它是被复制的,但是一旦你开始在父进程或子进程中更改数据,内存内容就会开始偏离。两个进程的内存是分开的。如果你在父母和孩子身上都得到了相同的结果,那么你可能在两个过程中都做了相同的事情。谢谢,但我还有一个问题。如果我使用malloc来创建内存呢<代码>int*X=(int*)malloc(5*sizeof(int))当我在子进程中修改数组时,该更改在父数组中也可用。你能解释一下为什么要这样做吗@Joachim@mirfan899这是不可能发生的,一旦你分叉了内存映射和内容是相同的,因为它是被复制的,但是一旦你开始在父进程或子进程中更改数据,内存内容就会开始偏离。两个进程的内存是分开的。如果您在父进程和子进程中得到相同的结果,那么您可能在这两个进程中做相同的事情。
 1  Child Array:    5   4   3   2   1   
 2  Array ptr = 0x7fff06c9f670
 3  Parent Array:   1   2   3   4   5   
 4  Array ptr = 0x7fff06c9f670