fork()和写时复制

来源:互联网 发布:中国象棋手机版软件 编辑:程序博客网 时间:2024/06/05 07:43

              fork()函数用来创建一个新进程,这个新进程被称为原有进程的子进程。fork()产生的自子进程获得父进程的数据空间,堆和栈的副本,此时子进程只拥有副本,并不拥有完整的内存空间,子进程在父进程的地址空间运行。这也就是写时复制。当子进程改变父进程中的数据时,数据就完全复制到子进程中了。

#include <unistd.h>  #include <stdio.h>    int glob = 1; /* on .data section */    int   main(void)  {      int var = 1; /* on stack */      pid_t pid;        printf("before fork\n");        if ((pid = fork()) < 0)      {          fprintf(stderr, "fork error\n");          return 0;      }      else if (pid == 0)      {          glob++;          var++;      }      else      {          sleep(2);      }        printf("pid = %d, glob = %d, var = %d\n", getpid(), glob, var);      return 0;  }  
打印:

pid=16155,glob=2,var=2,var1=0pid=16154,glob=1,var=1,var1=0

由结果可以看出,修改过的变量值都变了,这表明这些变量拥有了新的内存空间。 还有一点就是:父子进程共享正文段。



参考资料:unix环境高级编程