Linux 中的信号处理方式详解
在 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); // 忽略SIGINTprintf("进程PID: %d\n", getpid());while (1) {sleep(1);}return 0;
}
运行后按下 Ctrl+C,进程将无视该信号,不会中断。
四、总结
信号处理方式 | 调用方法 | 特点 |
---|---|---|
默认动作 | 不做处理或设置为 SIG_DFL | 系统根据信号类型执行默认操作 |
忽略信号 | signal(signo, SIG_IGN) | 信号被丢弃,不作任何处理 |
自定义处理 | signal() / sigaction() | 用户定义回调函数处理信号 |