考虑这个简单的代码:
int myvar = 0;
int main() {
if (fork()>0) {
myvar++;
} else {
// father do nothing
}
}
当孩子增加myvar时,是与父亲共享的值(如pthread)?
答案 0 :(得分:47)
不,是的。
不,它们不会以程序员可见的任何方式共享;这些进程可以独立地修改它们自己的变量副本,它们会在不对fork()父项,兄弟或后代的其他进程产生任何明显影响的情况下进行更改。
但是,是的,操作系统实际上最初会共享页面,因为fork实现了写时复制,这意味着如果没有任何进程修改页面,它们就会被共享。然而,这是一个可以忽略的优化。
如果您想拥有共享变量,请将它们放在匿名共享映射中(请参阅mmap()),在这种情况下,它们将真正得到共享,并附带所有注意事项。
答案 1 :(得分:36)
fork()
在分叉时创建父进程的精确副本。但是,在fork()
完成后,孩子的存在完全不同,并且不会向父母报告。
换句话说,不,父母的全局变量不会因孩子的变化而改变。
答案 2 :(得分:14)
在fork()之后,整个过程(包括所有全局变量)都是重复的。子节点是父节点的精确副本,除了它具有不同的PID(进程标识),不同的父节点,并且fork()返回0.全局变量在其自己的进程中仍然是全局变量。所以答案是否定的,在调用fork()之后,进程之间不会共享全局变量。
答案 3 :(得分:3)
不,因为除非实现某些IPC机制,否则不会在进程之间共享全局变量。将复制存储空间。因此,两个进程中的全局变量在fork之后将立即具有相同的值,但如果更改它,则另一个不会看到它发生更改。
另一方面,线程会共享全局变量。