MST

星途 面试题库

面试题:C语言多线程异常处理之信号捕获

在Linux环境下使用C语言多线程编程,假设一个线程可能会收到SIGSEGV信号,如何在该线程中正确捕获并处理这个信号,同时保证多线程环境下数据的一致性和程序的稳定性,请写出关键代码片段并简要说明原理。
18.4万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

关键代码片段

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

// 信号处理函数
void handle_segv(int signum) {
    printf("Caught SIGSEGV in thread\n");
    // 在此处添加处理逻辑,例如清理资源等
}

void* thread_function(void* arg) {
    // 为当前线程设置信号处理函数
    struct sigaction sa;
    sa.sa_handler = handle_segv;
    sigemptyset(&sa.sa_mask);
    sa.sa_flags = 0;
    if (sigaction(SIGSEGV, &sa, NULL) == -1) {
        perror("sigaction");
        pthread_exit(NULL);
    }

    // 线程的其他代码逻辑
    // ......

    pthread_exit(NULL);
}

int main() {
    pthread_t thread;
    if (pthread_create(&thread, NULL, thread_function, NULL) != 0) {
        perror("pthread_create");
        return 1;
    }

    if (pthread_join(thread, NULL) != 0) {
        perror("pthread_join");
        return 1;
    }

    return 0;
}

原理说明

  1. 信号处理函数设置:在每个可能收到SIGSEGV信号的线程中,使用sigaction函数为SIGSEGV信号设置特定的处理函数handle_segv。这样当该线程收到SIGSEGV信号时,会调用此处理函数。
  2. 数据一致性和程序稳定性:在信号处理函数handle_segv中,需要确保处理逻辑不会访问可能已损坏或不安全的数据,避免二次错误。通常在此处进行一些清理工作,如关闭文件描述符、释放锁等,以维护多线程环境下的数据一致性和程序稳定性。同时,在信号处理函数外的线程代码逻辑中,要遵循良好的编程规范,例如正确使用互斥锁来保护共享数据,避免出现未定义行为导致SIGSEGV信号的产生。