MST

星途 面试题库

面试题:C语言进程异常退出处理机制

假设你正在开发一个运行在Linux系统下的C语言程序,该程序需要长时间稳定运行。如果进程发生异常退出(例如段错误),请描述如何在代码层面实现一个机制,能够捕获这种异常退出,并记录相关的错误信息,以便事后分析。
21.6万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
  1. 安装信号处理函数
    • 在C语言中,可以使用signal函数来安装信号处理函数。对于段错误等异常情况,通常会产生SIGSEGV信号(段错误信号)。
    • 示例代码如下:
    #include <stdio.h>
    #include <signal.h>
    #include <stdlib.h>
    #include <execinfo.h>
    #include <unistd.h>
    
    void handle_segfault(int signum) {
        void *array[10];
        size_t size;
        char **strings;
        size_t i;
    
        // 获取堆栈回溯信息
        size = backtrace(array, 10);
        strings = backtrace_symbols(array, size);
    
        printf("Segmentation fault (signal %d):\n", signum);
        for (i = 0; i < size; i++) {
            printf("%s\n", strings[i]);
        }
    
        free(strings);
        // 这里可以将错误信息写入日志文件
        FILE *logfile = fopen("error.log", "a");
        if (logfile) {
            fprintf(logfile, "Segmentation fault (signal %d):\n", signum);
            for (i = 0; i < size; i++) {
                fprintf(logfile, "%s\n", strings[i]);
            }
            fclose(logfile);
        }
        exit(1);
    }
    
  2. 在主函数中注册信号处理函数
    • main函数中,使用signal函数将SIGSEGV信号与自定义的处理函数handle_segfault关联起来。
    int main() {
        signal(SIGSEGV, handle_segfault);
        // 主程序代码
        while (1) {
            // 长时间运行的任务
            sleep(1);
        }
        return 0;
    }
    
    • 上述代码中,handle_segfault函数作为SIGSEGV信号的处理函数。它使用backtracebacktrace_symbols函数获取堆栈回溯信息,打印并写入日志文件error.log。在main函数中,注册了该信号处理函数,这样当程序发生段错误时,handle_segfault函数就会被调用,记录错误信息。同时,除了SIGSEGV信号外,还可以考虑捕获其他可能导致异常退出的信号,如SIGABRT(程序异常终止信号)等,按照类似的方式为这些信号注册相应的处理函数。