【Linux】详解信号的分类&&如何自定义信号的作用
warning:
这篇文章距离上次修改已过436天,其中的内容可能已经有所变动。
在Linux中,信号可以根据来源和性质被分为不同的类别:
根据来源:
- 软件生成:如用户键入
Ctrl+C产生SIGINT,kill函数产生SIGTERM。 - 硬件生成:如除以0产生
SIGFPE,运算超时产生SIGXCPU。 - 进程内生成:如
abort函数产生SIGABRT。
- 软件生成:如用户键入
根据默认动作:
- 暂停进程并在后台恢复执行的信号:
SIGSTOP,SIGTSTP,SIGTTIN,SIGTTOU。 - 终止进程的信号:
SIGQUIT,SIGABRT,SIGILL,SIGSEGV,SIGTRAP。 - 忽略信号:
SIGKILL,SIGSTOP。
- 暂停进程并在后台恢复执行的信号:
根据可捕捉性:
- 不可捕捉的信号:
SIGKILL,SIGSTOP。 - 可捕捉的信号:其他所有信号。
- 不可捕捉的信号:
自定义信号的作用通常是通过编写信号处理函数来实现的。以下是一个简单的例子,展示了如何捕捉并处理一个信号。
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
void handle_sigint(int sig) {
write(1, "Caught SIGINT\n", 13);
// 通常情况下,你应该重新设置信号的默认行为或退出程序
// 例如:signal(SIGINT, SIG_DFL); 或 exit(0);
}
int main() {
// 注册信号处理函数
struct sigaction sa;
sa.sa_handler = &handle_sigint;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
if (sigaction(SIGINT, &sa, NULL) == -1) {
perror("sigaction");
exit(1);
}
// 程序继续执行,等待SIGINT信号
while(1) {
pause(); // 暂停进程直到信号到来
}
return 0;
}在这个例子中,程序使用sigaction函数注册了SIGINT的处理函数handle_sigint。当用户按下Ctrl+C时,会产生SIGINT信号,程序会调用handle_sigint函数来处理这个信号,输出信号被捕捉的消息。程序在handle_sigint函数执行完毕后继续等待其他信号。通过这种方式,你可以自定义进程对某个信号的响应。
评论已关闭