当用vfork()创建子进程时,如果用exit()退出,则结果正常,若用return退出,则会导致异常。
下面来分析为什么会这样,以及exit()和return的区别。
源代码:
1 #include<stdio.h>
2 #include<sys/types.h>
3 #include<unistd.h>
4 int main()
5 {
6 pid_t id = vfork();
7 if(id<0)
8 {
9 perror("fork");
10 exit(1);
11 }
12 else if(id == 0)
13 {
14 printf("child\n");
15 //exit(1);
16 return 0;
17 }
18 else
19 {
20 printf("father\n");
21 //exit(1);
22 return 0;
23 }
当用return退出时:
father
child
father
child
father
child
father
fork: Resource temporarily unavailable
当用exit退出时:
[fbl@localhost test4_7]$ ./test
child
father
原因分析:
因为vfork()创建的子进程与父进程共享数据段,而且保证子进程先于父进程运行,return是函数的返回,并且会把函数栈空间释放掉,而exit不会。所以当子进程的main函数return后,父进程收到子进程的退出信号开始从vfork()返回,但此时,父进程的栈空间被释放,导致出错。
exit()与return的区别:
1、return返回函数值,是关键字;exit是一个函数
2、return是语言级别的,它表示了调用堆栈的返回;exit是系统调用级别的,表示了一个进程的结束。
3、return是函数的返回,exit是进程的退出。
4、return是C语言提供的,exit是操作系统提供的
5、return用于结束一个函数的执行,将函数的执行信息传入其他调用函数使用;exit函数是退出应用程序,删除进程使用的内存空间,并将应用程序的一个状态返回给OS。
6、exit不会调用临时变量、局部变量的析构方法,可能会导致内存泄露。
转载于:https://blog.51cto.com/fengbaoli/1761474