#include <stdio.h>
#include <signal.h>
#include <unistd.h>
void sigint_handler(int signum) {
printf("Received SIGINT signal.\n");
}
int main() {
struct sigaction sa;
sa.sa_handler = sigint_handler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_RESTART;
if (sigaction(SIGINT, &sa, NULL) == -1) {
perror("sigaction");
return 1;
}
while (1) {
printf("Running...\n");
sleep(1);
}
return 0;
}
信号恢复原理
- SA_RESTART标志:在设置信号处理函数时,通过
sa.sa_flags = SA_RESTART
设置了该标志。当程序接收到信号并执行信号处理函数后,若该信号中断了某些系统调用(如read
、write
、accept
等),SA_RESTART
标志会使得这些被中断的系统调用自动重新启动,而不是返回错误(通常返回-1
并设置errno
为EINTR
),从而恢复到信号处理前的执行状态。
- 信号掩码:在信号处理函数执行期间,系统会自动将该信号加入到进程的信号掩码中,防止在处理该信号时再次接收到相同信号导致递归处理。处理函数执行完毕后,信号掩码会恢复到之前的状态,进程继续正常运行,就像信号未发生一样(除了执行了信号处理函数)。