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

更多内容

相关推荐

  1. linux | pause函数alarm函数、signal函数

    2024-05-14 06:12:09       33 阅读
  2. Linux Shell 函数详解

    2024-05-14 06:12:09       20 阅读
  3. Python函数详解

    2024-05-14 06:12:09       30 阅读
  4. Linux系列」Shell 函数详解

    2024-05-14 06:12:09       18 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-14 06:12:09       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-14 06:12:09       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-14 06:12:09       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-14 06:12:09       18 阅读

热门阅读

  1. MASK-RCNN自定义数据集优化思路(pytorch)

    2024-05-14 06:12:09       10 阅读
  2. ffmpeg

    2024-05-14 06:12:09       11 阅读
  3. Vue2 实现前端分页

    2024-05-14 06:12:09       8 阅读
  4. Element-UI快速入门

    2024-05-14 06:12:09       11 阅读
  5. 人大金仓参数查看和设置

    2024-05-14 06:12:09       10 阅读
  6. 记录解决问题--redis ssl连接

    2024-05-14 06:12:09       8 阅读
  7. MySQL中的多表设计

    2024-05-14 06:12:09       8 阅读