[英]Possible to call code upon termination in a C program?
在C ++中,如果我希望代碼調用一些不好的事情,我可以將代碼放在析構函數或try-catch中。
在C中是否有類似的技術,如果程序意外終止,我可以調用特定的例程(清理資源)?
在C中,您使用C標准庫函數atexit
,它允許您指定一個void
函數,在程序終止時(概念上,當第一次調用main
的右括號時}
不調用參數。
您可以在便攜式C中注冊最多32個這樣的功能,並按照注冊順序相反的順序調用它們。
如果要針對某些特定行為調用特定例程,可以嘗試處理信號: 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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.