Linux 中的信号处理方式详解

发布于:2025-06-27 ⋅ 阅读:(17) ⋅ 点赞:(0)

在 Linux 操作系统中,信号(Signal)是一种进程间或内核与进程之间的通信机制,用于通知进程某种异步事件的发生。例如,当用户按下 Ctrl+C 时,系统会向当前前台进程发送 SIGINT 信号。

本文将介绍三种常见的信号处理方式:

1、默认处理动作

2、自定义信号处理函数

3、忽略信号

一、默认处理动作

系统对每个信号都有一个默认处理动作。比如:

SIGTERM:终止进程(默认)

SIGKILL:强制终止进程,不能捕获

SIGCHLD:子进程退出时通知父进程,默认被忽略

示例代码:

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

int main() {
    printf("进程PID: %d\n", getpid());
    while (1) {
        sleep(1);
    }
    return 0;
}

运行后,在另一个终端输入:

kill -SIGTERM <PID>

进程将被终止,因为 SIGTERM 的默认动作是终止进程。

二、自定义信号处理函数(Custom Handler)

可以通过 signal() 或 sigaction() 函数,指定一个函数来处理信号,实现自定义逻辑。

示例代码:

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

void handler(int signo) {
    printf("收到SIGINT信号,进行自定义处理!\n");
}

int main() {
    signal(SIGINT, handler);  // 自定义处理SIGINT信号
    printf("进程PID: %d\n", getpid());
    while (1) {
        sleep(1);
    }
    return 0;
}

Ctrl+C默认代表SIGINT,而自定义SIGINT后按下 Ctrl+C,不会终止进程,而是打印信息:

收到SIGINT信号,进行自定义处理!

三、忽略信号(Ignore Signal)

可以通过将信号处理函数设置为 SIG_IGN,来忽略某个信号。

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

int main() {
    signal(SIGINT, SIG_IGN);  // 忽略SIGINT
    printf("进程PID: %d\n", getpid());
    while (1) {
        sleep(1);
    }
    return 0;
}

运行后按下 Ctrl+C,进程将无视该信号,不会中断。

四、总结

信号处理方式 调用方法 特点
默认动作 不做处理或设置为 SIG_DFL 系统根据信号类型执行默认操作
忽略信号 signal(signo, SIG_IGN) 信号被丢弃,不作任何处理
自定义处理 signal() / sigaction() 用户定义回调函数处理信号

网站公告

今日签到

点亮在社区的每一天
去签到