当用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退出时:

[[email protected] 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不会调用临时变量、局部变量的析构方法,可能会导致内存泄露。