Linux之vfork

vfork

vfrok用于创建一个新进程,而新进程的目的是为了exec一个新程序。vfork和fork的区别是vfork它不会将
父进程的地址空间复制一份到子进程。因为子进程会立即调用exec或exit,也就不会对这块地址读写了。
而在子进程调用exec之前, 其在父进程的空间中运行。另外一个区别是vfork保证子进程先运行,父进程在
这段时间挂起,直到子进 程调用了exec或exit,才会去调用父进程
 
vfork() differs from fork(2) in that the parent is suspended until  the
child  terminates (either normally, by calling _exit(2), or abnormally,
 after delivery of a fatal signal), or it makes  a  call  to  execve(2).
Until  that point, the child shares all memory with its parent, includ-
ing the stack.  The child must not return from the current function  or
call exit(3), but may call _exit(2)
vfork同父进程××共用××内存空间。vfork的代码执行的时候,父进程是停止的,
不然父子进程就会使用同样的内存空间,就会相互干扰。只有当子进程执行完毕退出时,
他会向父进程发送SIGCHILD信号告知父进程,父进程才会继续运行。但是如果子进程如果不
是通过这几种方式结束(by calling _exit(2), or abnormally,  after delivery of a fatal signal),
or it makes  a  call  toexecve(2).)就会从同父进程共用的代码中返回,也就是从main中返回,这时就会操作main的栈(因为父子的内存空间是共用的),
子进程可以很好的退出。但是当父进程也从main退出的时候,其栈上的内容,特别是返回地址被子进程返回的时候修改了。
因此从main返回后从栈中取出的返回地址是一个不可预测的地址,这时一般就会产生内存访问错误。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值