C语言里,main 函数中 return x和 exit(x) 到底有什么区别

 fork和vfork的差别:

  • fork 是 创建一个子进程,并把父进程的内存数据copy到子进程中
  • vfork是 创建一个子进程,并和父进程的内存数据share一起用

man vfork 一下,你可以看到,vfork是这样的工作的,

1)保证子进程先执行。

2)当子进程调用exit()或exec()后,父进程往下执行。

结束子进程的调用是exit()而不是return,如果你在vfork中return了,那么,这就意味main()函数return了,注意因为函数栈父子进程共享,所以整个程序的栈就跪了。

起初只有fork,但是很多程序在fork一个子进程后就exec一个外部程序,于是fork需要copy父进程的数据这个动作就变得毫无意了,而且还很重,所以,搞出了个父子进程共享的vfork。所以,vfork本就是为了exec而生

写时拷贝(COW)就是fork后来采用的优化技术,这样,对于fork后并不是马上拷贝内存,而是只有你在需要改变的时候,才会从父进程中拷贝到子进程中,这样fork后立马执行exec的成本就非常小了。而vfork因为共享内存所以比较危险,所以,Linux的Man Page中并不鼓励使用vfork()


linux man手册里明确说明vfork()之后,子进程只应该调用_exit()或者exec函数族,甚至调用exit()都是不正确的!
开发人员注意: 子进程绝对不允许在调用vfork的函数中return,vfork就是用来调用execve的。而且该系统调用在cow后就应该禁止使用了!

参考资料:

1.《UNIX环境高级编程(第3版)》

2. C语言里,main 函数中 return x和 exit(x) 到底有什么区别 ?

3. abort exit _exit return的区别

posted @   星辰大海浩瀚宇宙呀  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示