分叉之后,是否共享全局variables?

考虑这个简单的代码:

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之后立即具有相同的值,但是如果其中一个变化了,另一个就不会看到它改变了。

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