fork and vfork的区别

    技术2022-05-12  16

    在Unix下可以调用fork 或者vfork来新建一个process。 那么他们有什么区别和联系呢?1   使用fork调用会为子进程复制父进程所拥有的资源(进程环境,内存,堆,栈等)。而使用vfork新建的子进程则是和父进程共享所有的资源 ,在子进程中对数据的修改也就是对父进程数据的修改,这里一定要注意。2   使用fork系统调用产生父子进程,在默认情况下不加与人为干预,父子进程的执行循序是由OS调度的(也就是说他们两个执行顺序不确定);而对于vfork所生成的父子进程,父进程是在子进程调用了_exit() 或者exe()后才会继续执行。不调用这两个函数则会出错。总结:从上面可以看处 使用Vfork可以避免资源的浪费 但是也带了资源共享所产生的问题。PS:在linux中 ,对fork的调用采用了copy on write(COW:写时复制的方式)的方式: 在系统调用fork生成子进程的时候,不马上为子进程复制父进程的资源,而是在遇到“写入”(对资源进行修改)操作时才复制资源。

    示例:fork.c

    #include <stdio.h>#include <stdlib.h>#include <unistd.h>

    int global;

    int main(){ pid_t pid; int stack = 1;  int * heap;  heap = (int *)malloc(sizeof(int));  *heap = 2;  pid = fork();  if(pid < 0){  printf("fail to fork/n");  exit(1);  }else if(pid == 0){   global++;  stack++;  (*heap)++;    printf("the child, data : %d, stack : %d, heap : %d/n", global, stack, *heap);  exit(0); }  sleep(2);

     printf("the parent, data : %d, stack : %d, heap : %d/n", global, stack, *heap);  return 0;}

    [root@localhost yuan]# ./forkthe child, data : 1, stack : 2, heap : 3

    the parent, data : 0, stack : 1, heap : 2[root@localhost yuan]#

    示例:vfork.c

    #include <stdio.h>#include <stdlib.h>#include <unistd.h>

    int global;

    int main(void){ pid_t pid; int stack = 1; int * heap;  heap = (int *)malloc(sizeof(int)); *heap = 2;

     pid = vfork();

     if(pid < 0){  printf("fail to fork/n");  exit(1);  }else if(pid == 0){  global++;  stack++;  (*heap)++;

      printf("data : %d, stack : %d, heap : %d/n", global, stack, *heap);  printf("child terminates/n");

      exit(0);  }  /* sleep(2); */

     printf("data : %d, stack : %d, heap : %d/n", global, stack, *heap); printf("parent terminates/n");  return 0;}

    [root@localhost yuan]# gcc -o vfork vfork.c[root@localhost yuan]# ./vforkdata : 1, stack : 2, heap : 3child terminatesdata : 1, stack : 2, heap : 3parent terminates


    最新回复(0)