fork的数据是否共享

来源:互联网 发布:bangbangbangmv知乎 编辑:程序博客网 时间:2024/06/05 02:17
我们都知道fork的功能了,它可以创建一个新的进程,调用fork的进程,我们称为父进程,而新产生的进程,我们称为子进程。调用一次fork,有两个返回值,在父进程中返回子进程的PID,而在子进程中返回为0,调用失败,返回-1。我们知道fork之后子进程拷贝了父进程的PID,拷贝了父进程的代码内容,那我们都只子进程拷贝之后是从fork之后的下一条语句执行,因为计数器设置为了fork函数之后的下一条指令。这里我们留两个小问题:
        1、程序计数器是怎样实现代码定位的。
        2、代码段是真的拷贝了一份吗?
        今天我们来解决的问题是,fork之后子进程和父进程的数据是否共享。我们可以写一份代码测试一下。
#include
#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();
   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);
 }
}

运行结果:


代码中我们测试了全局数据,存放在栈区的临时变量以及堆栈数据,可以发现在子进程中修改之后,父进程中看不到,可以得出结论父子进程的全局数据、栈区和堆栈是不共享。
原创粉丝点击