【Linux】详解信号的分类&&如何自定义信号的作用
在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
函数执行完毕后继续等待其他信号。通过这种方式,你可以自定义进程对某个信号的响应。
评论已关闭