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

时间:2017-06-21 23:35:04

标签: c++ pointers fork

我们说我有一个班级......

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;
}

2 个答案:

答案 0 :(得分:1)

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

您需要使用线程

答案 1 :(得分:0)

一旦你分叉,新的子进程就有一个独立的地址空间。父级中的任何更改对于子级都是不可见的,并且子级中的任何更改对父级都是不可见的。现在,在幕后,大多数fork实现都使用copy-on-write,这样只要父或子开始写入它就会复制一页物理RAM,但这一切都隐藏在用户进程中。

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