最近学习了c++中fork()的作用。我遇到了 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
但答案似乎完全不符合直觉和逻辑。
虽然我在孩子和父母中得到了相同的 a 地址,但值不同,您能解释一下这种行为的原因吗?
不同进程的内存空间一般是分开的。您通常不能从另一个进程访问一个进程的内存。通常,出于安全目的,内存也会在 CPU 级别隔离,方法是让进程可见的实际内存地址是虚拟的,并透明地映射到不同的实际内存地址,由操作系统控制。
有没有什么办法可以在不使用文件在两者之间进行通信的情况下,使父母的任何改变反映在孩子身上,反之亦然
您的操作系统将具有在多个进程之间共享某些内存区域的功能。你需要使用那些。对于 Linux,请参见例如this question 或对于更便携的 C++ 库,请参见例如boost::进程间.
但是如果你真的想要一般共享内存,那么就不要使用
fork
来创建多个进程。而是在同一个进程中使用多个线程。