可以在C程序中终止时调用代码吗?

时间:2018-01-24 09:20:06

标签: c

在C ++中如果我希望代码调用一些不好的事情,我可以将代码放在析构函数或try-catch中。

C中是否有类似的技术,如果程序意外终止,我可以调用特定的例程(清理资源)?

3 个答案:

答案 0 :(得分:6)

在C中,您使用C标准库函数atexit,它允许您指定一个void函数,在程序终止时不会调用任何参数(概念上,当结束括号{{达到}的第一次调用的1}}。

您可以在便携式C中注册最多32个这样的功能,并按照注册顺序调用它们。

请参阅http://en.cppreference.com/w/c/program/atexit

答案 1 :(得分:2)

如果您想针对某些特定行为调用特定例程,您可以尝试处理信号:sigaction(2)

例如,有人想要处理分段错误的情况: Segmentation fault handling

处理CTRL + c的简单示例:

#include <signal.h>
#include <stdio.h>

void handle_signal(int);

int main(int argc, char* argv[])
{
    //Setup Signal handling
    struct sigaction sa;
    memset(&sa, 0, sizeof(sa));
    sa.sa_handler = handle_signal;
    sigaction(SIGINT, &sa, NULL);
    ...
}

void handle_signal(int signal)
{
    switch (signal) {
        case SIGINT:
            your_cleanup_function();
            break;
        default:
            fprintf(stderr, "Caught wrong signal: %d\n", signal);
            return;
    }
}

如后面的评论中所述,有许多不同的signal(7)可供使用。

答案 2 :(得分:0)

在C中没有像析构函数或try-catch块这样的功能。您只需要检查函数返回值并清理资源。

C程序员经常使用臭名昭着的 goto语句跳转到清理代码。

void foo()
{
    if (!doA())
        goto exit;
    if (!doB())
        goto cleanupA;
    if (!doC())
        goto cleanupB;

    /* everything has succeeded */
    return;

cleanupB:
    undoB();
cleanupA:
    undoA();
exit:
    return;
}

https://stackoverflow.com/a/245761/450989

复制的示例