linux

Linux进程信号处理:怎样响应系统信号

小樊
50
2025-05-07 07:51:56
栏目: 智能运维

在Linux系统中,进程可以通过信号来处理各种事件,例如中断、终止等。为了响应这些信号,进程需要设置一个信号处理器(signal handler)。以下是一个简单的示例,展示了如何在C语言中设置信号处理器来响应SIGINT信号(通常由Ctrl+C触发):

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

// 信号处理器函数
void signal_handler(int signum) {
    printf("接收到信号: %d\n", signum);
    // 在这里执行你的处理逻辑
    exit(signum); // 结束进程
}

int main() {
    // 注册信号处理器
    struct sigaction sa;
    sa.sa_handler = signal_handler; // 设置信号处理器函数
    sigemptyset(&sa.sa_mask); // 清空信号掩码
    sa.sa_flags = 0; // 无特殊标志

    if (sigaction(SIGINT, &sa, NULL) == -1) {
        perror("sigaction");
        exit(EXIT_FAILURE);
    }

    printf("按Ctrl+C发送SIGINT信号...\n");

    while (1) {
        sleep(1); // 主循环,可以执行其他任务
    }

    return 0;
}

在这个示例中,我们使用sigaction函数注册了一个信号处理器signal_handler来处理SIGINT信号。当进程收到SIGINT信号时,signal_handler函数会被调用,打印一条消息并结束进程。

要编译并运行此程序,请将其保存为signal_example.c,然后使用以下命令:

gcc signal_example.c -o signal_example
./signal_example

现在,当你按下Ctrl+C时,程序将捕获SIGINT信号并调用signal_handler函数。

请注意,这只是一个简单的示例。在实际应用中,你可能需要处理多个信号,并在信号处理器中执行更复杂的操作。同时,要注意信号处理器的安全性,因为在信号处理器中执行的代码应该是异步信号安全的(async-signal-safe)。

0
看了该问题的人还看了