簡體   English   中英

可以在C程序中終止時調用代碼嗎?

[英]Possible to call code upon termination in a C program?

在C ++中,如果我希望代碼調用一些不好的事情,我可以將代碼放在析構函數或try-catch中。

在C中是否有類似的技術,如果程序意外終止,我可以調用特定的例程(清理資源)?

在C中,您使用C標准庫函數atexit ,它允許您指定一個void函數,在程序終止時(概念上,當第一次調用main的右括號時}不調用參數。

您可以在便攜式C中注冊最多32個這樣的功能,並按照注冊順序相反的順序調用它們。

http://en.cppreference.com/w/c/program/atexit

如果要針對某些特定行為調用特定例程,可以嘗試處理信號: sigaction(2)

例如,有人想要處理分段故障的情況: 分段故障處理

處理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;
    }
}

正如后面的評論中所述,有許多不同的信號(7)可供使用。

沒有在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復制的示例

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM