父母和孩子的地址可变但价值不同

问题描述 投票:0回答:1

最近学习了c++中fork()的作用。我遇到了 2 个问题,我找不到任何原因。

  1. 虽然我在孩子和父母中得到了相同的 a 地址,但值不同,您能解释一下这种行为的原因吗?
  2. 有没有什么办法可以在不使用文件在两者之间进行通信的情况下,使父母的任何改变反映在孩子身上,反之亦然
#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

但答案似乎完全不符合直觉和逻辑。

c++ c linux unix fork
1个回答
0
投票

虽然我在孩子和父母中得到了相同的 a 地址,但值不同,您能解释一下这种行为的原因吗?

不同进程的内存空间一般是分开的。您通常不能从另一个进程访问一个进程的内存。通常,出于安全目的,内存也会在 CPU 级别隔离,方法是让进程可见的实际内存地址是虚拟的,并透明地映射到不同的实际内存地址,由操作系统控制。

有没有什么办法可以在不使用文件在两者之间进行通信的情况下,使父母的任何改变反映在孩子身上,反之亦然

您的操作系统将具有在多个进程之间共享某些内存区域的功能。你需要使用那些。对于 Linux,请参见例如this question 或对于更便携的 C++ 库,请参见例如boost::进程间.

但是如果你真的想要一般共享内存,那么就不要使用

fork
来创建多个进程。而是在同一个进程中使用多个线程。

© www.soinside.com 2019 - 2024. All rights reserved.