exit函数相关

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


 

 

你可能感兴趣的:(exit函数相关)