Linux信号(Signal)是一种进程间通信(IPC)机制,用于通知接收进程某个事件已经发生。信号是异步的,进程不需要等待信号的到来,它们可以在任何时间点发送给进程。信号可以由内核、其他进程或者进程自身发送。
Linux信号可以分为不可靠信号和可靠信号:
以下是一个简单的C语言程序,演示如何捕获和处理SIGINT信号:
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
void handle_sigint(int sig) {
printf("Caught SIGINT, exiting gracefully.\n");
exit(0);
}
int main() {
// 注册信号处理函数
signal(SIGINT, handle_sigint);
printf("Press Ctrl+C to send SIGINT...\n");
while (1) {
sleep(1); // 模拟长时间运行的任务
}
return 0;
}
问题:信号丢失或处理不及时。
原因:
解决方法:
sigaction
函数代替signal
函数,因为sigaction
提供了更多的控制和可靠性。#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
void handle_sigint(int sig) {
printf("Caught SIGINT, exiting gracefully.\n");
exit(0);
}
int main() {
struct sigaction sa;
sa.sa_handler = handle_sigint;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
// 使用sigaction注册信号处理函数
sigaction(SIGINT, &sa, NULL);
printf("Press Ctrl+C to send SIGINT...\n");
while (1) {
sleep(1); // 模拟长时间运行的任务
}
return 0;
}
通过这种方式,可以更可靠地处理信号,减少信号丢失的风险。
领取专属 10元无门槛券
手把手带您无忧上云