在Linux系统中,捕捉所有信号可以通过编写一个信号处理函数并使用signal()
或sigaction()
系统调用来实现。以下是使用这两种方法的示例代码。
signal()
函数#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
void signal_handler(int signum) {
printf("捕获到信号 %d\n", signum);
}
int main() {
// 定义信号集合
sigset_t set;
sigfillset(&set); // 将信号集合填充为所有信号
// 遍历所有信号并设置处理函数
for (int signum = 1; signum < NSIG; ++signum) {
if (signal(signum, signal_handler) == SIG_ERR) {
perror("signal");
exit(EXIT_FAILURE);
}
}
printf("开始捕捉所有信号...\n");
while (1) {
pause(); // 等待信号
}
return 0;
}
sigaction()
函数#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
void signal_handler(int signum) {
printf("捕获到信号 %d\n", signum);
}
int main() {
struct sigaction sa;
sa.sa_handler = signal_handler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
// 遍历所有信号并设置处理函数
for (int signum = 1; signum < NSIG; ++signum) {
if (sigaction(signum, &sa, NULL) == -1) {
perror("sigaction");
exit(EXIT_FAILURE);
}
}
printf("开始捕捉所有信号...\n");
while (1) {
pause(); // 等待信号
}
return 0;
}
Linux系统定义了多种信号,常见的包括:
SIGINT
(中断信号,通常是Ctrl+C)SIGTERM
(终止信号)SIGKILL
(不可捕获的终止信号)SIGUSR1
和 SIGUSR2
(用户自定义信号)SIGTERM
信号,执行清理工作后再退出。sigaction()
而不是signal()
可以更好地控制信号处理。通过上述方法,可以在Linux系统中有效地捕捉和处理所有信号。
领取专属 10元无门槛券
手把手带您无忧上云