我最近学习了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
但答案似乎完全不直观,也不合逻辑。
2条答案
按热度按时间axzmvihb1#
在这里,虽然我在子节点和父节点中获得了相同的地址,但值不同,您能否解释一下这种行为的原因。
不同进程的内存空间通常是分开的。你通常不能从一个进程访问另一个进程的内存。通常内存也是出于安全目的在CPU级别上隔离的,方法是让进程可见的实际内存地址是虚拟的,并透明地Map到不同的真实的内存地址,由操作系统控制。
是否有任何方法可以使父对象中的任何更改都反映在子对象中,反之亦然,而无需使用文件在两者之间进行通信
你的操作系统将具有在多个进程之间共享某些内存区域的功能。你需要使用这些功能。对于linux,请参见this question;对于更易移植的C++库,请参见boost::interprocess。
但是如果你真的想共享内存,那么就不要使用
fork
来创建多个进程,而是在同一个进程中使用多个线程。idfiyjo82#
首先
fork
不是C++的一部分,它是Unix(例如UNIX、Linux、BSD)的一部分。Fork复制进程(你的操作系统知道一个便宜/快速的方法),每个进程的父进程和子进程在复制后继续。
想象一下,把一张纸放在复印机上,然后把复印件交给另一个人,他们可以在复印件上写字,你也可以在自己的复印件上写字。
如果您需要共享内存(通常不是一个好主意:变异是不好的,并发变异是非常不好的),那么使用线程,而不是进程。