一尘不染

分叉后,是否共享全局变量?

linux

考虑以下简单代码:

 int myvar = 0;
 int main() {
     if (fork()>0) {
       myvar++;
     } else {
       // father do nothing
     }
 }

当child增加myvar时,该值是否与父亲共享(如pthread)?


阅读 278

收藏
2020-06-02

共1个答案

一尘不染

不,是的。

不,它们不会以程序员可见的任何方式共享;进程可以独立地修改自己的变量副本,并且它们将在不影响其他进程(例如fork()父,兄弟姐妹或后代)的情况下进行更改。

但是,是的,OS实际上最初确实共享页面,因为fork实现了写时复制功能,这意味着只要没有任何进程修改页面,就可以共享页面。但是,这是可以忽略的优化。

如果您要使用共享变量,请将它们放在匿名共享映射中(请参阅mmap()),在这种情况下,它们确实会被共享,并附带所有警告。

2020-06-02