前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >fork到底是深拷贝还是浅拷贝

fork到底是深拷贝还是浅拷贝

作者头像
opencode
发布2022-12-26 15:38:08
2100
发布2022-12-26 15:38:08
举报
文章被收录于专栏:知识同步

面试常问

进程定义两个变量,fork函数在子进程返回0,在父进程返回子进程号,可以看到子进程和父进程的变量地址都是一样的,看起来是一个浅拷贝,但是我们看到,在子进程中改变值并不会影响父进程的值,地址一样,但是值不同?其实这里面涉及到一个技术叫写时复制技术,我们要知道,我们看到的地址是虚拟地址,并不是真实的物理地址,每个进程相同的虚拟地址可以对应不同的物理地址。但是写时复制指的是当你改变某个变量时,物理地址才会改变。所以我们这样理解,首先子进程和父进程的虚拟地址和指向的物理地址都一样,但是当改变某个值时,物理地址才发生改变。

一般的变量会深拷贝,但是像文件句柄呢,例如管道这些文件是共享的,也就是浅拷贝的,可以共用的

代码语言:javascript
复制
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>

int main()
{
    char str[6] = "hello";
    int a = 1;

    pid_t pid = fork();

    if (pid == 0)
    {
        str[0] = 'b';
        a=2;
        printf("sub str=%s\n", str);
        printf("sub a=%x\n", a);
        printf("sub a=%x\n", &a);
        printf("sub point:%x\n", &str);
    }
    else
    {
        sleep(1);
        printf("main str=%s\n", str);
        printf("main a=%x\n", a);
        printf("main a=%x\n", &a);
        printf("main point:%x\n", &str);
    }

    return 0;

    /*
    sub str=bello
    sub a=2
    sub a=ffffe994
    sub b=1
    sub b=ffffe998
    sub point:ffffe9a2
    main str=hello
    main a=1
    main a=ffffe994
    main b=2
    main b=ffffe998
    main point:ffffe9a2
    */
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-08-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档