程序退出的函数有:
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; }