vfork 为何挂掉

在知乎上,有个人问了这样的一个问题——为什么vfork的子进程里用return,整个程序会挂掉,而且exit()不会?并给出了如下的代码,下面的代码一运行就挂掉了,但如果把子进程的return改成exit(0)就没事。

我受邀后本来不想回答这个问题的,因为这个问题明显就是RTFM的事,后来,发现这个问题放在那里好长时间,而挂在下面的几个答案又跑偏得比较严重,我觉得可能有些朋友看到那样的答案会被误导,所以就上去回答了一下这个问题。

下面我把问题和我的回答发布在这里,也供更多的人查看。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

int main(void) {

int var;

var = 88;

if ((pid = vfork()) < 0) {

printf("vfork error");

exit(-1);

} else if (pid == 0) { /* 子进程 */

var++;

return 0;

}

printf("pid=%d, glob=%d, var=%d\n", getpid(), glob, var);

return 0;

}

参见:

http://www.guokr.com/blog/806477/

http://www.guokr.com/blog/806478/

http://www.doc88.com/p-1408571371043.html

http://www.kx001.com/repaste/166312542_9771967396.html

http://www.kx001.com/repaste/166312542_9771963600.html

http://www.douban.com/note/486426067/

http://dig.chouti.com/link/6769845

http://10yuanfang.lofter.com/

时间: 2024-10-25 07:32:44

vfork 为何挂掉的相关文章

(转帖)为什么vfork的子进程里用return,整个程序会挂掉,而且exit()不会?

在知乎上,有个人问了这样的一个问题--为什么vfork的子进程里用return,整个程序会挂掉,而且exit()不会?并给出了如下的代码,下面的代码一运行就挂掉了,但如果把子进程的return改成exit(0)就没事. 我受邀后本来不想回答这个问题的,因为这个问题明显就是RTFM的事,后来,发现这个问题放在那里好长时间,而挂在下面的几个答案又跑偏得比较严重,我觉得可能有些朋友看到那样的答案会被误导,所以就上去回答了一下这个问题. 下面我把问题和我的回答发布在这里,也供更多的人查看. #inclu

关于vfork的一个问题

为什么vfork的子进程里面用return,整个程序会挂掉,而exit()不会. 首先我们来看一下,出现挂掉的代码:  #include<stdio.h>  #include<stdlib.h>  #include<unistd.h>    int main()  {      int var;      var = 88;      if((pid = vfork()) < 0)      {          printf("error vfork&

fork和vfork,return和exit的理解

fork和vfork的差别: 1.fork是创建一个子进程,并把父进程的内存数据copy到子进程中. vfork是创建一个子进程,并和父进程的内存数据share一起. 2.vfork是这样的工作的: (1).保证子进程先执行. (2).当子进程调用exit()或exec()后,父进程往下执行. 3.fork后来采用的优化技术,这样,对于fork后并不是马上拷贝内存,而是只有你在需要改变的时候,才会从父进程中拷贝到子进程中,这样fork后立马执行exec的成本就非常小了.而vfork因为共享内存所

vfork与fork(转载)

最近学了一些关于Unix/Linux下C编程的知识,大致了解了关于基于文件描述符的IO.基于流的IO.进程.进程间通信.信号.网络编程.gtk+编程,等等,以及其对应的相关API,看完后觉得也就这样,甚至有些傲慢,这些平日听起来高深的技术也就这些东西,但同时也感到疑惑:怎么可能,绝对不是我第一印象感觉的那样,绝对还有很多我不知道的. 幸好当天晚上没事逛了陈皓的coolshell,看到了一篇文章<vfork 挂掉的一个问题>,才感觉到自己的第一感觉是多么的无知,并不是它简单,而是因为难的.复杂的

vfork &amp; fork

转载 http://coolshell.cn/articles/12103.html 在知乎上,有个人问了这样的一个问题——为什么vfork的子进程里用return,整个程序会挂掉,而且exit()不会?并给出了如下的代码,下面的代码一运行就挂掉了,但如果把子进程的return改成exit(0)就没事. 我受邀后本来不想回答这个问题的,因为这个问题明显就是RTFM的事,后来,发现这个问题放在那里好长时间,而挂在下面的几个答案又跑偏得比较严重,我觉得可能有些朋友看到那样的答案会被误导,所以就上去回

fork和vfork

转载 http://coolshell.cn/articles/12103.html 在知乎上,有个人问了这样的一个问题--为什么vfork的子进程里用return,整个程序会挂掉,而且exit()不会?并给出了如下的代码,下面的代码一运行就挂掉了,但如果把子进程的return改成exit(0)就没事. 我受邀后本来不想回答这个问题的,因为这个问题明显就是RTFM的事,后来,发现这个问题放在那里好长时间,而挂在下面的几个答案又跑偏得比较严重,我觉得可能有些朋友看到那样的答案会被误导,所以就上去回

关于为什么RAID5往往掉一个盘后第二个盘也立刻挂掉的原因分析

很多人遇到过服务器RAID5挂掉,往往掉一个盘后,第二个盘也立刻挂掉. 大家都知道RAID5 一次允许一个盘缺失, RAID 5也是以数据的校验位来保证数据的安全,但它不是以单独硬盘来存放数据的校验位,而是将数据段的校验位交互存放于各个硬盘上.这样,任何一个硬盘损坏,都可以根据其它硬盘上的校验位来重建损坏的数据.硬盘的利用率为n-1. 如果挂掉两个盘,数据就玩完了.理论上两个硬盘同时失效的概率是很低的,但为什么会这样呢? 从数学角度说,每个磁盘的平均无故障时间 (MTBF) 大约为 50 万至

服务器挂掉的几种可能

1.如果不是涉及到大并发的问题,有可能遭受恶意攻击.查看secure日志.安全日志. 服务器访问日志,然后查看攻击点,然后使用命令禁掉IP 就OK了 iptables -I INPUT -s ***.***.***.*** -j DROP 2.如果网站涉及到大并发问题,有规律就是在每天的固定时间点(并发访问高潮)挂掉,这个时候需要业务逻辑做mencache缓存,然后升级服务器德硬件,联系服务器代理商解决. 3.如果排除了以上两种情况,有可能是因为数据库负载到达瓶颈,这个时候查看服务器服务器上的m

系统调用vfork()

vfork()学习 vfork()与fork()的一个重要区别, 等待子进程退出后, 父进程才会执行. 1 #include <stdio.h> 2 #include <sys/types.h> 3 #include <unistd.h> 4 5 int globVar = 5; 6 7 int main(void) 8 { 9 pid_t pid; 10 int var = 1, i; 11 12 printf("fork is diffirent with