Linux 中 alarm 函数详解

简介

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;
}
  • 执行效果

更多内容

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hello阿尔法

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值