Linux信号(Signal)是一种进程间通信(IPC)机制,用于通知接收进程某个事件已经发生。信号是异步的,进程不需要等待信号的到来,而是在信号到达时由内核通知进程。信号可以用来终止进程、改变进程的行为或者通知进程某个条件已经满足。
Linux系统定义了多种信号,常见的包括:
SIGINT
(2):用户按下Ctrl+C时发送给前台进程。SIGTERM
(15):请求进程终止。SIGKILL
(9):强制终止进程,无法被捕获或忽略。SIGUSR1
和SIGUSR2
(10和12):用户自定义信号。以下是一个简单的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;
}
原因:信号是异步的,如果发送信号的频率很高,可能会导致信号丢失。
解决方法:使用可靠信号(如实时信号),它们不会丢失。
sigqueue(pid, SIGUSR1, {si_signo=SIGUSR1, si_code=SI_QUEUE, si_value={int=42}});
原因:在信号处理函数中访问共享资源可能导致竞态条件。
解决方法:使用互斥锁或其他同步机制来保护共享资源。
#include <pthread.h>
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void handle_sigint(int sig) {
pthread_mutex_lock(&mutex);
// 安全地访问共享资源
pthread_mutex_unlock(&mutex);
}
原因:进程可能会屏蔽某些信号,导致无法及时响应。
解决方法:合理设置信号屏蔽字,确保关键信号不被屏蔽。
sigset_t set;
sigemptyset(&set);
sigaddset(&set, SIGINT);
sigprocmask(SIG_UNBLOCK, &set, NULL);
通过以上方法,可以有效利用Linux信号机制来实现进程间的通信和控制。
领取专属 10元无门槛券
手把手带您无忧上云