zoukankan      html  css  js  c++  java
  • fork与vfork的区别

         fork与vfork的区别

      1.fork函数介绍

      #include sys/types.h>
      #include unistd.h>
      pid_t fork (void );
      正确返回:父进程中返回子进程的进程号;子进程中返回0;(单调用双返回函数)
      错误返回:-1;
      子进程是父进程的一个拷贝。具体说,子进程从父进程那得到了数据段和堆栈段,但不是与父进程共享而是单独分配内存。fork函数返回后,子进程和父进程都是从fork函数的下一条语句开始执行。由于子进程与父进程的运行是无关的,父进程可先于子进程运行,子进程也可先于父进程运行,所以下段程序可以有两种运行结果。

      #include stdio.h>
      #include sys/types.h>
      #include unistd.h>
      int globa = 4;
      int main (void )
      {
              pid_t pid;
              int vari = 5;
              printf ("before fork " );
              if ((pid = fork())  0){
                      printf ("fork error ");
                      exit (0);
              }
              else if (pid == 0){ 
                      globa++ ;
                      vari--;
                      printf("Child changed ");
              }
              else
                      printf("Parent did not changde ");
              printf("globa = %d vari = %d ",globa,vari);
              exit(0);
      }


      运行结果:(可能出现的一种结果) 
      before fork
      Child changed
      globa = 5 vari = 4
      Parent did not changde
      globa = 4 vari = 5
      

      2.vfork函数介绍
      vfork创建新进程的主要目的在于用exec函数执行另外的程序,实际上,在没调用exec或exit之前子进程的运行中是与父进程共享数据段的。在vfork调用中,子进程先运行,父进程挂起,直到子进程调用exec或exit,在这以后,父子进程的执行顺序不再有限制。
      #include stdio.h>
      #include sys/types.h>
      #include unistd.h>
      int globa = 4;
      int main (void )
      {
              pid_t pid;
              int vari = 5;
              if ((pid = vfork())  0){
                      printf ("fork error ");
                      exit (0);
              }
              else if (pid == 0){
                      globa++ ;
                      vari--;
                      printf("Child changed ");
                      _exit(0);
              }
              else
                      printf("Parent did not changde ");
              printf("globa = %d vari = %d ",globa,vari);
              exit(0);
      }
      运行结果(固定的):
      Child changed
      Parent did not changde
      globa = 5 vari = 4
     

      区别:
          1、fork()用于创建一个新进程。由fork()创建的子进程是父进程的副本。即子进程获取父进程数据空间,堆和 栈的副本。父子进程之间不共享这些存储空间的部分。而vfork()创建的进程并不将父进程的地址空间完全复制到子进程中,因为子进程会立即调用exec (或exit)于是也就不会存放该地址空间。相反,在子进程调用exec或exit之前,它在父进程的空间进行。
          2、vfork()与fork()另一个区别就是:vfork保证子进程先运行,在调用exec或exit之前与父进程数据是共享的,在它调用exec或exit之后父进程才可能被调度运行。
          3、vfork和fork之间的还有一个区别是: vfork保证子进程先运行,在她调用exec或exit之后父进程才可能被调度运行。如果在调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。
      

      相同:两者被调用一次,但是返回两次。两次返回的唯一区别是子进程的返回值是0,而父进程的返回值则是新子进程的进程ID。

  • 相关阅读:
    Java 基础(接口的应用:代理模式 Proxy)
    Appium 环境配置
    破解CCleaner
    数据驱动
    (C语言内存二十)C语言内存泄露(内存丢失)
    (C语言内存十九)C语言野指针以及非法内存操作
    (C语言内存十八)malloc函数背后的实现原理——内存池
    (C语言内存十七)栈溢出攻击的原理是什么?
    (C语言内存十六)C语言动态内存分配
    (C语言内存十五)用一个实例来深入剖析函数进栈出栈的过程
  • 原文地址:https://www.cnblogs.com/guochuanrui/p/5614207.html
Copyright © 2011-2022 走看看