在C ++中如果我希望代码调用一些不好的事情,我可以将代码放在析构函数或try-catch中。
C中是否有类似的技术,如果程序意外终止,我可以调用特定的例程(清理资源)?
答案 0 :(得分:6)
在C中,您使用C标准库函数atexit
,它允许您指定一个void
函数,在程序终止时不会调用任何参数(概念上,当结束括号{{达到}
的第一次调用的1}}。
您可以在便携式C中注册最多32个这样的功能,并按照注册顺序调用它们。
答案 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;
}
复制的示例