目录
一、什么是 SIGALRM
在 Linux 系统中,信号是进程间通信的一种方式,用于通知进程发生了某些特定事件。SIGALRM 是众多信号类型中的一种,其全称为 “Alarm clock signal”,即闹钟信号。从名字不难理解,SIGALRM 信号与时间相关,主要用于在特定的时间点通知进程执行某些操作。
SIGALRM 的符号常量定义在<signal.h>头文件中,在不同的平台上,信号的编号可能发生变化,因此使用符号名称更具可移植性。SIG 是信号名的通用前缀,而 ALRM 则是 alarm 的缩写 ,即定时器。当程序调用alarm()系统调用设置一个定时器,在指定的秒数后,内核就会向进程发送 SIGALRM 信号。 比如你设置了alarm(5),那就意味着 5 秒后进程会收到 SIGALRM 信号。它就像是你给进程设置的一个闹钟,时间一到,就会 “响铃” 提醒进程该干活了。
二、SIGALRM 的工作原理
2.1 与定时器的紧密联系
在 Linux 系统中,每个进程都有一个属于自己的定时器,就像每个打工人都有一个专属的闹钟一样。进程可以通过alarm()系统调用设置这个定时器,当定时器超时的时候,就会触发 SIGALRM 信号 。alarm()函数的原型如下:
#include <unistd.h>
unsigned int alarm(unsigned int seconds);
其中,seconds参数表示要设定的定时时间,以秒为单位。当alarm()调用成功后,开始计时,超过该时间将触发 SIGALRM 信号。函数返回当前进程以前设置的定时器剩余秒数,如果之前没有设置定时器,那么返回 0。例如:
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
void handler(int signo) {
printf("Received SIGALRM signal!\n");
}
int main() {
// 安装信号处理函数
signal(SIGALRM, handler);
// 设置5秒后触发SIGALRM信号
alarm(5);
printf("Waiting for SIGALRM signal...\n");
while (1) {
// 进程进入无限循环,等待信号
}
return 0;
}
在这个示例中,alarm(5)设置了 5 秒的定时时间,5 秒后进程会收到 SIGALRM 信号,然后执行handler函数,打印出 "Received SIGALRM signal!"。
2.2 信号处理流程
当进程接收到 SIGALRM 信号时,处理流程如下:
默认动作:如果进程没有对 SIGALRM 信号进行自定义处理,那么它将执行默认动作,SIGALRM 信号的默认动作是终止进程。就好比你没有给闹钟设置特殊的响铃方式,它就会按照默认的铃声响起来。
自定义处理:进程可以通过signal()函数或者sigaction()函数来安装自定义的信号处理函数,当接收到 SIGALRM 信号时,就会执行这个自定义的处理函数。比如你可以给闹钟设置成播放你喜欢的音乐作为铃声。
忽略信号:进程也可以选择忽略 SIGALRM 信号,就像你把闹钟设置成静音,不管它怎么响,你都不理会。可以使用signal(SIGALRM, SIG_IGN)来忽略 SIGALRM 信号 。
下面是使用sigaction()函数自定义处理 SIGALRM 信号的示例:
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
void handler(int signo) {
printf("Caught SIGALRM signal!\n");
}
int main() {
struct sigaction sa;
sa.sa_handler = handler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
// 使用sigaction安装信号处理函数
if (sigaction(SIGALRM, &sa, NULL) == -1) {
perror("sigaction");
return 1;
}
// 设置3秒后触发SIGALRM信号
alarm(3);
printf("Waiting for SIGALRM signal...\n");
while (1) {
// 进程进入无限循环,等待信号
}
return 0;
}
在这个例子中,通过sigaction()函数安装了自定义的信号处理函数handler,当 SIGALRM 信号到达时,会执行handler函数,打印 "Caught SIGALRM signal!"。
三、SIGALRM 的常见应用场景
3.1 超时控制