Linux 应用编程学习 第九章 关于进程中vfork()创建子进程

上一篇文章讲到了fork的父进程创建子进程的一个过程,且其中数据的复制,和文件描述符的共享。

一、fork 系统调用的使用场景

1.父进程希望子进程复制自己,父、子进程执行相同的程序,各自在自己的进程空间中运行。
2.子进程执行一个新的程序,从该程序的 main 函数开始运行,调用 exec 函数。

二、fork 函数的缺点

在上面的第二个场景中,因为fork会先进行一次程序的复制,将父进程的数据段、堆、栈数据进行复制,创建一个子进程,然后将执行exec函数,将新程序的main加载现在子进程的内存区域中,将之前复制的数据进行覆盖。导致出现复制数据后又丢弃同个数据。

三、vfork 的引入

最终目标是一样的,都是创建一个进程;并且返回值也是一样的。“这个函数主要是针对 fork 函数的缺点而引入,所以它的使用场景自然也是在子进程中执行exec 调用加载外部的一个新程序,从新程序的 main 函数开始运行。
.

四、fork 与 vfork 函数之间的主要区别

vfork 函数和 fork 函数都是创建一个进程,那它们之间有什么区别呢?主要包括以下两点:
1.对于 fork 函数,fork 会为子进程创建一个新的地址空间(也就是进程空间),子进程几乎完全拷贝了父进程,包括数据段、代码段、堆、栈等;
而对于vfork函数,子进程在终止或者成功调用 exec 函数之前,子进程与父进程共享地址空间,共享所有内存,包括数据段、堆栈等,所以在子进程在终止或成功调用 exec函数前,不要去修改除 vfork 的返回值的 pid_t类型的变量之外的任何变量(父进程的变量)、也不要调用任何其它函数(除_exit 和 exec 函数之外的任何其它函数),否则将会影响到父进程。“(注意:vfork 创建的子进程如果要终止应调用_exit,而不能调用 exit 或 return 返回,因为如果子进程调用 exit 或 return 终止,则会调用父进程绑定的终止处理函数以及刷新父进程的 stdio 缓冲,影响到父进程)
2.对于 fork 函数,fork 调用之后,父、子进程的执行次序不确定;而对于 vfork 函数,vfork函数会保证子进程先运行,父进程此时处于阻塞、挂起状态,在子进程终止或成功调用 exec函数之后,父进程才会被调度运行。“
(注意:如果子进程在终止或成功调用 exec 函数之前,依赖于父进程的进一步动作,将会导致死锁!)

3.fork 后子进程会继承父进程绑定的信号处理函数,若调用exec 加载新程序后,就不会在继承这个信号处理函数了!
4.、fork后子进程会继承父进程的信号掩码,执行exec后仍会继承这个信号掩码。
转载https://www.bilibili.com/video/BV16Z4y187Cw?p=72&spm_id_from=pageDriver&vd_source=e43b7d34b9cdc80de90102c97f57b51c

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值