fork, vfork, clone, exec的区别

进程的创建有多种方式,各方式之间的区别是怎样的?

1.fork()

<span style="font-size:18px;">#include <unistd.h>
pid_t fork(void);

</span><span style="font-size:18px;">returns : 0 if in child; process ID in parent; -1 if error
</span>
  1. fork()是调用一次返回两次,在子进程中返回值为0(子进程可以通过getppid()获取父进程的ID),在父进程中返回值为子进程的ID(因为父进程会有多个子进程,并且无法获取子进程ID)
  2. fork通常采用COW机制:对于父子进程共享的区域,内核将它们设置为只读;如果父、子进程中的任一试图修改这些只读区域,则内核只为修改区域的那块内存复制一个副本,通常是一“页”
  3. fork的一个特性:父进程的所有打开文件描述符都被复制到子进程中,父子进程的每个相同的文件描述符共享一个文件表项

2.vfork()

  • 调用序列和返回值与fork相同
  • 通过vfork创建的子进程会立即调用exec,执行一段新的程序

3.fork与vfork的比较

  • vfork与fork一样都创建一个子进程,但vfork并不将父进程的地址空间完全复制到子进程中
  • vfork保证子进程先运行,父进程会出现短暂的终止,子进程会借用父进程的地址空间,之后子进程调用exec或者exit,父进程才继续运行;
  • fork后父子进程的运行先后与OS的调度有关

4.exec

当进程调用exec时,该进程执行的程序完全替换为新的程序,而新程序则从其main函数开始执行。
注意:exec并没有创建一个新的进程。只是用一个全新的程序替换当前进程的正文,数据,堆和栈段

5.clone

lone可以让你有选择性的继承父进程的资源,你可以选择想vfork一样和父进程共享一个虚存空间,从而使创造的是线程,你也可以不和父进程共享,你甚至可以选择创造出来的进程和父进程不再是父子关系,而是兄弟关系





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值