fork,vfork,clone的区别Zz

来源:互联网 发布:在线浏览器代理软件 编辑:程序博客网 时间:2024/04/30 12:34

转载http://blog.chinaunix.net/uid-20665441-id-305483.html

一、fork 

  1. 调用方法 

  #include <sys/types.h> 
   #include <unistd.h> 
   pid_t fork(void); 
   正确返回:在父进程中返回子进程的进程号,在子进程中返回0 
  错误返回:-1 

  2. fork函数调用的用途 

  一个进程希望复制自身,从而父子进程能同时执行不同段的代码。 

  二、vfork 

  1. 调用方法 

  与fork函数完全相同 

  #include <sys/types.h> 

  #include <unistd.h> 

  pid_t vfork(void); 

  正确返回:在父进程中返回子进程的进程号,在子进程中返回0 

  错误返回:-1 

  2. vfork函数调用的用途 

  用vfork创建的进程主要目的是用exec函数执行另外的程序。 

  三、clone 

  1.调用方法 

  #include <sched.h> 

  int clone(int (*fn)(void *), void *child_stack, int flags, void *arg); 

  正确返回:返回所创建进程的PID,函数中的flags标志用于设置创建子进程时的相关选项,具体含义参看P25 

  错误返回:-1 

  2.clone()函数调用的用途 

  用于有选择地设置父子进程之间需共享的资源 

  四、fork,vfork,clone的区别 

   1. fork出来的子进程是父进程的一个拷贝,即,子进程从父进程得到了数据段和堆栈段的拷贝,这些需要分配新的内存;而对于只读的代码段,通常使用共享内存 的方式访问;而vfork则是子进程与父进程共享内存空间, 子进程对虚拟地址空间任何数据的修改同样为父进程所见;clone则由用户通过参clone_flags 的设置来决定哪些资源共享,哪些资源拷贝。 

   2. fork不对父子进程的执行次序进行任何限制,fork返回后,子进程和父进程都从调用fork函数的下一条语句开始行,但父子进程运行顺序是不定的,它 取决于内核的调度算法;而在vfork调用中,子进程先运行,父进程挂起,直到子进程调用了exec或exit之后,父子进程的执行次序才不再有限 制;clone中由标志CLONE_VFORK来决定子进程在执行时父进程是阻塞还是运行,若没有设置该标志,则父子进程同时运行,设置了该标志,则父进 程挂起,直到子进程结束为止。
原创粉丝点击