exit(),_exit()与return的比较与浅析

来源:互联网 发布:java与或非逻辑符号 编辑:程序博客网 时间:2024/05/20 14:25

先说return与exit():

首先我们应该很清楚的是return与exit()的根本性质是不同的,前者是对于子函数而言的,二后者是对于进程而言的。return是说子函数在遇到return时候,就不在往下执行,返回调用的函数中。而exit()是说遇到它本进程执行结束。

1>对于在main函数的最后的return与exit()能完成相同的功能。显然,主函数退出进程也就结束了,所以在某种意义上说,两者之间可以勉强画个等号吧。

2>return从子函数中返回,而子进程调用exit()退出,调用exit()时要调用一段终止处理程序,然后关闭所有的I/O流。

看下面的例子程序

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int test(void)
{
 
 printf("hello!\n");
 sleep(1);
 //exit(0);
 return 0;
}
int main()
{

 while(1)
 {
  test();
 }
 return 0;
}

当屏蔽exit()时,函数循环输出hello,但是当取消它时候,程序只是输出一次hello.

这个还是比较好理解的。

 

下面分析exit()&_exit():

//Terminate the program with STATUS without calling any of the function registered with atexit() or onexit()

看看上面的说明,用atexit() or onexit()进行声明或者说调用的函数,在调用exit()退出时,会先调用上述声明的函数,就像C++中的构造函数一样,但是_exit()的调用是不会调用上述函数的。

另外,在调用_exit()函数后,进程马上退出,不会处理标准I/O缓冲区,而exit()会处理。

其次,_exit()的调用不会返回,但是它会发送SIGCHLD信号给父进程,父进程可以通过wait()函数取得子进程的结束状态。

 

看下面的例子:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
 printf("hello\n");
 printf("world");
   exit(0);
 _exit(0);
 return 0;
}

屏蔽了exit(0)时,将只输出hello

取消屏蔽exit(0)时,将输出

hello

world

 

 

 

 

 

over!!!!!!!!!!!!!!!!!!!!