程序退出的函数有:
return(), exit(), _exit(), atexit(), on_exit(), abort(), pthread_exit(), assert()等。
下面这个程序对退出函数做了个测试。
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<signal.h>
#include <pthread.h>
//return将控制权移交给递归的前一级,直到最初的一级(main函数下),return才会终止程序。
void test_return()
{
printf("return \n");
return;
}
//exit关闭所有文件,终止正在执行的程序;
//exit(0)表示正常退出,exit(x) x非0表示异退出
void test_exit()
{
printf("testing exit \n");
printf("This is the content in buffer ");
printf("This is the content in buffer2 ");
exit(0);
}
//_exit直接使进程停止运行,清除其使用的内存空间,并销毁其在内核中的各种数据结构;
//但不会把文件缓冲区中的内容写回文件。
void test__exit()
{
printf("testing _exit \n");
printf("This is the content in buffer1 ");//打印终止于'\n',后面部分将不会打印
printf("This is the content in buffer2 ");
_exit(0);
}
void atexit_register(void)
{
printf("1. hello, I'm atexit_register \n");
}
void atexit_register2(void)
{
printf("2. hello, I'm atexit_register2 \n");
}
//atexit能在main函数之后执行;
//atexit()可支持至少32个函数的注册,函数可以在程序终止前完成一些“清理”工作;
//atexit()函数指定的函数在入栈时的顺序和调用atexit()函数的顺序相反,即它们在执行时遵循后进先出(LIFO)的原则。
int test_atexit()
{
atexit(atexit_register);
atexit(atexit_register2);
return 1;
}
void on_exit_register(int status,void *arg)
{
printf("before exit()!\n");
printf("exit (%d)\n",status);
printf("arg = %s\n",(char*)arg);
}
void on_exit_register2(int, void*)
{
printf("2. before exit()!\n");
}
//on_exit能在main函数之后执行;
//_onexit和atexit功能有些类似,_onexit的注册函数可带参数,atexit的注册函数则为void;
//_onexit is a Microsoft extension.
void test_on_exit()
{
char * str="testing on_exit";
on_exit(on_exit_register,(void *)str);
on_exit(on_exit_register2,(void *)str);
//exit(1234);
}
//abort()使程序异常退出,abort在退出时会发出一个SIGABRT信号;
//abort()函数将关闭和冲洗(flush)所有流。
void abort_handler(int i)
{
printf("catch SIGABRT signal\n");
}
void test_abort()
{
signal(SIGABRT,abort_handler);
printf("hello, I'm abort \n");
abort();
printf("hello2, I'm abort \n");
}
//宏assert()用于错误检测。如果表达式的结果为零,宏写错误信息到STDERR并退出程序执行。如果宏NDEBUG已经定义,宏assert()将被忽略。
//在这里定义#define NDEBUG 不行,在编译的时候g++ -D NDEBUG exit.cpp,assert()才会被忽略。
void test_assert(int a)
{
assert(0!=a);
printf("hello, I'm test_assert \n");
}
int main()
{
test_exit();
test__exit();
//test_atexit();
//test_on_exit();
//test_abort();
//test_return();
//pthread_exit(NULL); //多线程时再将,也可以将程序直接退出。
printf("return from main \n");
return 1;
}