C语言中的程序终止
C语言中程序终止执行的情况有3种,具体如下:
- 程序终止最常见的情况是使用main函数,通过return语句将状态代码返回给执行环境;
- 通过调用exit函数、_Exit函数或者quick_exit函数正常终止程序执行;
- 此外,信号也能终止程序执行;调用abort函数能够导致程序异常终止。
本文主要讨论第二种和第三种情况。
正常终止程序执行,以exit函数为例,其函数原型如下所示:
_Noreturn void exit(int status);
当程序终止执行时,程序会通过参数status告诉执行环境程序终止执行的原因。参数status是状态代码,其值遵守一定的约定。ISO/IEC 9899:2018标准第7.22.4.4 The exit function节规定:如果status值为0或者EXIT_SUCCESS,则返回成功终止状态的实现定义形式;如果status值为EXIT_FAILURE,则返回不成功终止状态的实现定义形式;否则status值由实现定义。EXIT_SUCCESS和EXIT_FAILURE都是<stdlib.h>头文件中定义的宏。
如果正常终止程序执行,可以自行安排清理程序,一个常用的方法就是通过atexit函数或者at_quick_exit函数注册清理函数,以atexit函数为例:
#include <stdio.h> #include <stdlib.h> void cleanUp(void) { /* 清理函数代码。*/ } int main(void) { atexit(cleanUp); //通过atexit函数注册cleapUp函数。 exit(EXIT_SUCCESS); }
调用exit函数时,会先调用cleanUp函数。
异常终止程序执行,以abort函数为例,其函数原型如下所示:
_Noreturn void abort(void);
操作系统使用信号来报告执行程序的异常情况,所以应定义信号处理函数;当特定的信号生成时,调用信号处理函数。abort函数会生成SIGABRT信号,导致程序异常终止。
#include <signal.h> #include <stdio.h> #include <stdlib.h> int main(void) { FILE *pFile; signal(SIGABRT, SIG_DFL); //设置SIGABRT信号处理函数。 pFile = fopen("gch.txt", "r"); if(pFile==NULL) { perror("Error opening file"); abort(); } fclose(pFile); return 0; }
这里将使用默认函数处理SIGABRT信号。