目录
- 简介
- 函数原型
- 函数参数
- 返回值
- 使用示例
- 设置 3 秒闹钟
- 修改闹钟与取消闹钟
- 设置 1 秒周期定时器
- 更多内容
简介
alarm 函数的功能是设置一个闹钟(定时器),当闹钟时间到时,内核会向当前进程发送一个 SIGALRM 信号。
打开 Linux 终端,输入 man alarm
命令查看 alarm 的详细信息如下:
函数原型
#include <unistd.h>
unsigned int alarm(unsigned int seconds);
函数参数
- seconds 为闹钟定时时间,单位为秒。
- 当 seconds 为 0 时,为取消之前设置的闹钟。
返回值
- 若该进程之前设置了闹钟,且还没有超时,则返回之前闹钟的剩余时间,同时之前设置的闹钟被替换。
- 若该进程之前未设置闹钟,或设置的闹钟已超时,返回 0。
使用示例
每个进程只能设置一个 alarm 闹钟。当 SIGALRM 信号到来时,系统的默认操作是终止进程,但是当进程中设置了 alarm,大多数都会捕获此信号。
注意:示例程序中使用 sleep 旨在实现效果,在项目中混合使用 sleep 和 alarm 函数并不是一个好主意,可能会引发问题。
设置 3 秒闹钟
- 程序示例
// alarm.c
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
void sig_handler(int signal)
{
printf("receive the signal %d.\n", signal);
}
int main(void)
{
signal(SIGALRM, sig_handler); // 设置信号,绑定信号处理函数
int res = alarm(3); // 设置定时时间 3 秒
printf("alarm 返回值: %d \n", res); // 返回 0
while (1)
{
sleep(1);
}
return 0;
}
- 执行效果
修改闹钟与取消闹钟
- 程序示例
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
void sig_handler(int signal)
{
printf("receive the signal %d.\n", signal);
}
int main(void)
{
signal(SIGALRM, sig_handler); // 设置信号,绑定信号处理函数
int res = alarm(3); // 设置定时时间 3 秒
printf("alarm 返回值: %d \n", res); // 返回 0
sleep(2); // 延时 2 秒
res = alarm(2); // 修改定时时间为 2 秒,返回值为上次定时剩余时间,即为 1
printf("alarm 返回值: %d \n", res);
sleep(1); // 延时 1 秒
res = alarm(0); // 取消定时,返回值为上次定时剩余时间,即为 1
printf("alarm 返回值: %d \n", res);
while (1)
{
sleep(1);
}
return 0;
}
- 执行效果
设置 1 秒周期定时器
alarm 并不能重复触发,要实现周期定时器的效果,可以在 SIGALRM 信号处理函数中再次设置闹钟。
- 程序示例
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
void sig_handler(int signal)
{
printf("signal interrupt! \n");
alarm(1);
}
int main(void)
{
signal(SIGALRM, sig_handler); // 设置信号,绑定信号处理函数
alarm(1); // 设置定时时间 3 秒
while (1)
{
sleep(1);
}
return 0;
}
- 执行效果
更多内容
- CSDN博客:@Hello阿尔法
- 哔哩哔哩:@Hello阿尔法
- 知乎:@Hello阿尔法