代码之家  ›  专栏  ›  技术社区  ›  anon

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

  •  38
  • anon  · 技术社区  · 14 年前

    考虑这个简单的代码:

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

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

    4 回复  |  直到 7 年前
        1
  •  47
  •   MarkR    14 年前

    不,是的。

    不,它们不会以程序员可见的任何方式共享;进程可以独立地修改自己的变量副本,并且它们将更改,而不会对fork()父进程、兄弟进程或子进程的其他进程产生任何明显影响。

    但是,是的,操作系统实际上在最初共享页面,因为fork实现了copy-on-write,这意味着如果没有任何进程修改页面,那么它们是共享的。然而,这是一个可以忽略的优化。

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

        2
  •  36
  •   Kevin Lacquement    14 年前

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

    换句话说,不,父级的全局变量不会因子级的更改而改变。

        3
  •  14
  •   KZcoding Tharun    9 年前

    fork()之后,整个进程(包括所有全局变量)都将被复制。子级是父级的精确副本,但它具有不同的PID(进程ID)、不同的父级,并且fork()返回0。全局变量在其自身的过程中仍然是全局的。所以答案是否定的,全局变量在调用fork()后不会在进程之间共享。

        4
  •  3
  •   Tom    14 年前

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

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