C语言中的退出处理程序

3

大家好,

我想在我的程序中开发一个退出处理程序。

我对C语言很陌生,这和在C语言中管理信号有关吗?

如何知道我的程序是正常结束还是出现了问题?

如果不是正常结束,如何在退出时获得最大限度的信息?


日志做得更好。 - neohope
@cedrou 两个都可以 :) - user2122937
3个回答

12
  1. C语言(C89和C99标准)提供atexit()注册在程序退出时调用的函数。这与信号无关。与信号处理程序不同,你可以注册多个退出处理程序。退出处理程序按照使用atexit()注册的相反顺序被调用。

  2. 惯例是,当程序正常退出时,它返回退出状态0。这可以通过从main()中返回0或从程序中的任何地方调用exit(0)来实现。

  3. 在Unix/Linux/POSIX类型的操作系统中(不确定Windows),父进程使用wait()系统调用或其变体获得有关子进程的退出状态信息。

示例:以下是一个简单的程序及其输出,演示了atexit()的使用:

#include <stdlib.h>
#include <stdio.h>

static void exit_handler1(void)
{
    printf("Inside exit_handler1()!n");
}

static void exit_handler2(void)
{
    printf("Inside exit_handler2()!n");
}

int main(int argc, char *argv[])
{
    atexit(exit_handler1);
    atexit(exit_handler2);
    return 0;
}

程序生成的输出:
Inside exit_handler2()!
Inside exit_handler1()!

0

如果我没理解错,您是在询问如何在程序退出时返回结果。您应该使用exit(x);函数来从程序中返回值。您可以将任何整数值作为参数x。并且不要忘记在程序开始处使用#include <stdlib.h>


如果我有一个缓冲区溢出,我将无法到达退出回调函数,我想避免任何崩溃。 - user2122937
1
通常情况下,除非你在调试器下运行C程序或者使用C解释器,否则没有办法捕获崩溃(例如写入无效的内存地址)。 - FooF

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接