当前位置: C语言 -- 专题 -- C语言中的程序终止

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_SUCCESSEXIT_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信号。