修改跨 fork() 的指针中的数据

Modify data in a pointer across fork()?

本文关键字:指针 数据 fork 修改      更新时间:2023-10-16

假设我声明了一个类...

class foo {
  public:
    int i;
    foo(int j) { i = j; }
};

然后,我在代码中使用它,如下所示:

foo *bar = new foo(17);
cout << "Bar is " << bar->i << endl;
if (!fork()) {
  bar->i = 2;
  exit(0);
}
cout << "Bar is now " << bar->i << endl;

我用g++编译它并运行可执行文件。我得到以下输出:

me@computer:~$ ./a.out
Bar is 17
Bar is now 17

我有一个类似的问题,我需要指向在if (!fork())块中修改的类(比示例稍微复杂一些(的指针。有什么办法可以做到这一点吗?

我能够将这个类与字符串相互转换,如果这样可以更容易的话。我正在使用 C++11 和 cmake ,如果相关的话。

更新:线程现在正在为我创造奇迹。谢谢大家。以下是我所做的,基本上:

void blob(foo *bar)
{
  bar->i = 2;
}
int main()
{
  foo *bar = new foo(17);
  thread th (blob,bar);
  th.detach();
  delete bar;
  return 0;
}
一旦

你做了分叉,你就会产生一个完全不同的进程,有一个完全独立的(但最初是重复的(内存。无论您修改什么,都不会反映在主进程中,反之亦然(在分叉之后(。

为此,您需要使用线程

分叉后,新的子进程将具有独立的地址空间。 父项中的任何更改对子项不可见,子项中的任何更改对父项不可见。 现在在幕后,大多数 fork 实现都使用写入时复制,因此它只在父级或子级开始写入物理 RAM 时复制一页物理 RAM,但这都是对用户进程隐藏的。

您需要使用线程或某种进程间通信。 有很多方法可以做到这一点,所有方法都有自己的权衡。