当我们在c中使用fork时,进程之间是否共享数据?
is data shared between processes when we use fork in c?
在此 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;
}
这是程序的输出。
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()
创建调用进程的副本,包括分配给它的所有内存。
每个进程都有自己的地址 space,指针的值在该地址的上下文中 space。因此在原始进程中打印某个变量的地址将给出与在派生进程中打印该地址相同的输出。
但是,就操作系统而言,地址并不相等。操作系统负责确保每个进程都有自己的内存。
进程之间有共享内存的方法(即一个进程写入共享内存的内容,另一个进程可以看到)。但是,这不是默认情况下发生的情况,并且在主机操作系统的帮助下仍然会发生。
fork
创建 parent 进程内存映像的精确副本(异常请参见手册页)。这称为 Copy On Write
(COW) 分叉。到目前为止child只读取数据,parent和child都有相同的数据副本但是当child写入时,会生成一个新副本然后child和 parent 对自己的数据有不同的副本
在此 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;
}
这是程序的输出。
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()
创建调用进程的副本,包括分配给它的所有内存。
每个进程都有自己的地址 space,指针的值在该地址的上下文中 space。因此在原始进程中打印某个变量的地址将给出与在派生进程中打印该地址相同的输出。
但是,就操作系统而言,地址并不相等。操作系统负责确保每个进程都有自己的内存。
进程之间有共享内存的方法(即一个进程写入共享内存的内容,另一个进程可以看到)。但是,这不是默认情况下发生的情况,并且在主机操作系统的帮助下仍然会发生。
fork
创建 parent 进程内存映像的精确副本(异常请参见手册页)。这称为 Copy On Write
(COW) 分叉。到目前为止child只读取数据,parent和child都有相同的数据副本但是当child写入时,会生成一个新副本然后child和 parent 对自己的数据有不同的副本