fork的数据是否共享

我们都知道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);
 }
}

运行结果:


代码中我们测试了全局数据,存放在栈区的临时变量以及堆栈数据,可以发现在子进程中修改之后,父进程中看不到,可以得出结论父子进程的全局数据、栈区和堆栈是不共享。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值