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