C语言 父级和子级具有变量地址,但值不同

7xllpg7q  于 2023-03-17  发布在  其他
关注(0)|答案(2)|浏览(131)

我最近学习了c++中fork()的功能,遇到了两个问题,我找不到任何原因。
1.在这里,虽然我在子节点和父节点中得到了相同的地址,但值不同,您能否解释一下这种行为的原因。
1.是否有任何方法可以使父对象中的任何更改都反映在子对象中,反之亦然,而无需使用文件在两者之间进行通信

#include <bits/stdc++.h>
#include<unistd.h>
#include<stdlib.h>
using namespace std;

signed main() {
    int *a=(int *)malloc(sizeof(int));
    *a=5;
    cout<<a<<endl;
    int pid=fork();
    if(pid!=0)
    {
        sleep(2);
        *a+=2;
        cout<<a<<" "<<*a<<" "<<"PARENT"<<endl;
    }
    else
    {
        *a+=1;
        cout<<a<<" "<<*a<<" "<<"CHILD"<<endl;
    }

}

这是上面代码的输出。

0x561d5c19beb0
0x561d5c19beb0 6 CHILD
0x561d5c19beb0 7 PARENT

我以为答案会是

0x561d5c19beb0
0x561d5c19beb0 6 CHILD
0x561d5c19beb0 8 PARENT

0x561d5c19beb0
<different_value> 6 CHILD
0x561d5c19beb0 7 PARENT

但答案似乎完全不直观,也不合逻辑。

axzmvihb

axzmvihb1#

在这里,虽然我在子节点和父节点中获得了相同的地址,但值不同,您能否解释一下这种行为的原因。
不同进程的内存空间通常是分开的。你通常不能从一个进程访问另一个进程的内存。通常内存也是出于安全目的在CPU级别上隔离的,方法是让进程可见的实际内存地址是虚拟的,并透明地Map到不同的真实的内存地址,由操作系统控制。
是否有任何方法可以使父对象中的任何更改都反映在子对象中,反之亦然,而无需使用文件在两者之间进行通信
你的操作系统将具有在多个进程之间共享某些内存区域的功能。你需要使用这些功能。对于linux,请参见this question;对于更易移植的C++库,请参见boost::interprocess
但是如果你真的想共享内存,那么就不要使用fork来创建多个进程,而是在同一个进程中使用多个线程。

idfiyjo8

idfiyjo82#

首先fork不是C++的一部分,它是Unix(例如UNIX、Linux、BSD)的一部分。
Fork复制进程(你的操作系统知道一个便宜/快速的方法),每个进程的父进程和子进程在复制后继续。
想象一下,把一张纸放在复印机上,然后把复印件交给另一个人,他们可以在复印件上写字,你也可以在自己的复印件上写字。
如果您需要共享内存(通常不是一个好主意:变异是不好的,并发变异是非常不好的),那么使用线程,而不是进程。

相关问题