面试题答案
一键面试- 安装信号处理函数:
- 在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); }
- 在C语言中,可以使用
- 在主函数中注册信号处理函数:
- 在
main
函数中,使用signal
函数将SIGSEGV
信号与自定义的处理函数handle_segfault
关联起来。
int main() { signal(SIGSEGV, handle_segfault); // 主程序代码 while (1) { // 长时间运行的任务 sleep(1); } return 0; }
- 上述代码中,
handle_segfault
函数作为SIGSEGV
信号的处理函数。它使用backtrace
和backtrace_symbols
函数获取堆栈回溯信息,打印并写入日志文件error.log
。在main
函数中,注册了该信号处理函数,这样当程序发生段错误时,handle_segfault
函数就会被调用,记录错误信息。同时,除了SIGSEGV
信号外,还可以考虑捕获其他可能导致异常退出的信号,如SIGABRT
(程序异常终止信号)等,按照类似的方式为这些信号注册相应的处理函数。
- 在