先说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!!!!!!!!!!!!!!!!!!!!