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

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

#include #include #include 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; } 

这是程序的输出。

  1 Child Array: 5 4 3 2 1 2 Array ptr = 0x7fff06c9f670 3 Parent Array: 1 2 3 4 5 4 Array ptr = 0x7fff06c9f670 

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

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

fork创建父进程内存映像的精确副本(例外参见手册页)。 这称为Copy On Write (COW)fork。 最多时间子项只读取数据,父项和子项都有相同的数据副本,但是当孩子写入时,会生成一个新副本,然后子项和父项都有不同的副本用于自己的数据

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

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

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

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