C语言中的程序终止
C语言中的程序终止
C语言中程序终止执行的情况有3种,具体如下:
- 程序终止最常见的情况是使用main函数,通过return语句将状态代码返回给执行环境;
- 通过调用exit函数、_Exit函数或者quick_exit函数正常终止程序执行;
- 此外,信号也能终止程序执行;调用abort函数能够导致程序异常终止。
本文主要讨论第二种和第三种情况。
正常终止程序执行,以exit函数为例,其函数原型如下所示:
_Noreturn void exit(int status);
当程序终止执行时,程序会通过参数status告诉执行环境程序终止执行的原因。参数status是状态代码,其值遵守一定的约定。ISO/IEC 9899:2024标准第7.24.5.4 The exit function节规定:如果status值为0或者EXIT_SUCCESS,则返回成功终止状态的实现定义形式;如果status值为EXIT_FAILURE,则返回不成功终止状态的实现定义形式;否则status值由实现定义。EXIT_SUCCESS和EXIT_FAILURE都是
如果正常终止程序执行,可以自行安排清理程序,一个常用的方法就是通过atexit函数或者at_quick_exit函数注册清理函数,以atexit函数为例:
#include
#include
void cleanUp(void)
{
/* 清理函数代码。*/
}
int main(void)
{
atexit(cleanUp); //通过atexit函数注册cleapUp函数。
exit(EXIT_SUCCESS);
}
调用exit函数时,会先调用cleanUp函数。
异常终止程序执行,以abort函数为例,其函数原型如下所示:
_Noreturn void abort(void);
操作系统使用信号来报告执行程序的异常情况,所以应定义信号处理函数;当特定的信号生成时,调用信号处理函数。abort函数会生成SIGABRT信号,导致程序异常终止。
#include
#include
#include
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信号。
主要参考资料:
1、ISO/IEC 9899:2024
2、ISO/IEC 9899:2018