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

40 c unix linux fork

考虑这个简单的代码:

 int myvar = 0;
 int main() {
     if (fork()>0) {
       myvar++;
     } else {
       // father do nothing
     }
 }
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*rkR 50

不,是的.

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

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

如果你想拥有共享变量,请将它们放在一个匿名的共享映射中(参见mmap()),在这种情况下,它们真的会被共享,并附带所有的警告.


Kev*_*ent 37

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

换句话说,不,父母的全局变量不会被孩子的变化所改变.

  • 打开相同文件的两个进程和共享在分叉之前创建的文件描述符的两个进程之间存在一个关键区别:分叉进程共享相同的打开文件描述和偏移量; 如果一个进程移动文件指针(通过读或写或寻找),它也会影响另一个进程.单独打开时不会发生这种情况,因为它们具有单独的打开文件描述.请参阅:open(),fork(),lseek()等. (4认同)

Tha*_*n26 14

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


Tom*_*Tom 7

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

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