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

时间:2010-11-28 19:47:25

标签: c linux unix fork

考虑这个简单的代码:

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

当孩子增加myvar时,是与父亲共享的值(如pthread)?

4 个答案:

答案 0 :(得分:47)

不,是的。

不,它们不会以程序员可见的任何方式共享;这些进程可以独立地修改它们自己的变量副本,它们会在不对fork()父项,兄弟或后代的其他进程产生任何明显影响的情况下进行更改。

但是,是的,操作系统实际上最初会共享页面,因为fork实现了写时复制,这意味着如果没有任何进程修改页面,它们就会被共享。然而,这是一个可以忽略的优化。

如果您想拥有共享变量,请将它们放在匿名共享映射中(请参阅mmap()),在这种情况下,它们将真正得到共享,并附带所有注意事项。

答案 1 :(得分:36)

fork()在分叉时创建父进程的精确副本。但是,在fork()完成后,孩子的存在完全不同,并且不会向父母报告。

换句话说,不,父母的全局变量不会因孩子的变化而改变。

答案 2 :(得分:14)

在fork()之后,整个过程(包括所有全局变量)都是重复的。子节点是父节点的精确副本,除了它具有不同的PID(进程标识),不同的父节点,并且fork()返回0.全局变量在其自己的进程中仍然是全局变量。所以答案是否定的,在调用fork()之后,进程之间不会共享全局变量。

答案 3 :(得分:3)

不,因为除非实现某些IPC机制,否则不会在进程之间共享全局变量。将复制存储空间。因此,两个进程中的全局变量在fork之后将立即具有相同的值,但如果更改它,则另一个不会看到它发生更改。

另一方面,线程会共享全局变量。