我们都知道fork的功能了,它可以创建一个新的进程,调用fork的进程,我们称为父进程,而新产生的进程,我们称为子进程。调用一次fork,有两个返回值,在父进程中返回子进程的PID,而在子进程中返回为0,调用失败,返回-1。我们知道fork之后子进程拷贝了父进程的PID,拷贝了父进程的代码内容,那我们都只子进程拷贝之后是从fork之后的下一条语句执行,因为计数器设置为了fork函数之后的下一条指令。这里我们留两个小问题:
1、程序计数器是怎样实现代码定位的。
2、代码段是真的拷贝了一份吗?
今天我们来解决的问题是,fork之后子进程和父进程的数据是否共享。我们可以写一份代码测试一下。
#include
#include
int global=10;
#include
int global=10;
int main()
{
int var=11;
int a=13;
int*p=(int*)malloc(sizeof(int));
p=&a;
printf("before fork data:pid=%d,global=%d,var=%d,*p=%d\n",getpid(),global\
,var,*p);
pid_t n=fork();
{
int var=11;
int a=13;
int*p=(int*)malloc(sizeof(int));
p=&a;
printf("before fork data:pid=%d,global=%d,var=%d,*p=%d\n",getpid(),global\
,var,*p);
pid_t n=fork();
if(n==0)
{
global++;
var++;
p=&var;
printf("child data:pid=%d,global=%d,var=%d,*p=%d\n",getpid(),global\
,var,*p);
}
else
{
sleep(3);
printf("father data:pid=%d,global=%d,var=%d,*p=%d\n",getpid(),global\
,var,*p);
}
{
global++;
var++;
p=&var;
printf("child data:pid=%d,global=%d,var=%d,*p=%d\n",getpid(),global\
,var,*p);
}
else
{
sleep(3);
printf("father data:pid=%d,global=%d,var=%d,*p=%d\n",getpid(),global\
,var,*p);
}
}
运行结果:
代码中我们测试了全局数据,存放在栈区的临时变量以及堆栈数据,可以发现在子进程中修改之后,父进程中看不到,可以得出结论父子进程的全局数据、栈区和堆栈是不共享。