飞凌嵌入式ElfBoard-进程间的通信之信号的发送alarm

alarm()其实是一个配置定时器的函数,当定时器溢出的时候,内核会向进程发送SIGALRM信号。

1.头文件

#include <unistd.h>

2.函数原型

unsigned int alarm(unsigned int seconds);

3.参数

seconds:以秒为单位设置定时时间,如果在seconds秒时间内再次调用了alarm()函数设置了新的闹钟,则会将之前的覆盖掉,如果后面的seconds配置为0,就是取消之前的定时器配置。

4.返回值

如果之前设置过一个定时器且未触发,alarm 会返回该定时器剩余的秒数。如果之前未设置定时器或定时器已触发,返回值为 0。

5.示例:通过alarm()函数定时处理事件

|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| #include <stdio.h> #include <unistd.h> #include <signal.h> void handle_alarm(int sig) { printf("Alarm triggered!\n"); } int main() { // 注册 SIGALRM 信号处理函数 signal(SIGALRM, handle_alarm); // 配置第一个定时器为10秒 unsigned int remaining = alarm(10); printf("First alarm set for 10 seconds, previous alarm remaining time: %u seconds\n", remaining); // 等待3秒再设置新的定时器 sleep(3); // 配置新的定时器为5秒,返回之前定时器的剩余时间 remaining = alarm(5); printf("New alarm set for 5 seconds, remaining time from previous alarm: %u seconds\n", remaining); // 等待定时器触发 pause(); return 0; } |

6.运行结果

|----------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| First alarm set for 10 seconds, previous alarm remaining time: 0 seconds New alarm set for 5 seconds, remaining time from previous alarm: 7 seconds Alarm triggered! |

7.代码解析

第一个 alarm(10) 设置一个10秒的定时器,返回0,因为之前没有设置定时器。sleep(3) 等待3秒。第二次调用 alarm(5) 会取消之前的10秒定时器,并返回它剩余的秒数(约7秒)。5秒后,新的定时器触发,SIGALRM 信号被发送,调用 handle_alarm 函数输出"Alarm triggered!"。

相关推荐
略略略咯咯3 分钟前
centos更换镜像源
linux·运维·centos
j7~10 分钟前
【Linux】二十七.线程篇四《Linux多线程编程:线程互斥(互斥量的底层到封装)、线程安全和冲入、死锁》---详解
linux·开发语言·c++·线程安全·死锁·线程互斥·重入
yunwei3743 分钟前
eBPF 入门实践教程第五十篇:使用 TCX Link 实现可组合的流量控制
linux·云原生·开源
2401_827501281 小时前
Linux系统移植
linux·arm开发·单片机
2601_965798472 小时前
Build a Consulting Site in 2026: Nifty Theme Practical Review
java·linux·数据库
加油码2 小时前
共享内存详解:原理、系统调用与高性能进程间通信
linux·c语言·c++
枳实-叶2 小时前
Linux 环境下段错误出现的原因及调试方法
linux·运维·服务器
Dawn-bit2 小时前
Linux文本处理三剑客之sed详解
linux·运维·服务器·云计算·运维开发
dok122 小时前
Johannes 《Linux内核模块与设备驱动开发:编写Linux驱动程序》 (9)manual_cdev
linux·运维·驱动开发
Cx330❀3 小时前
【Linux网络】深入 HTTP 协议(五):从 Cookie/Session 原理到 C++ 源码实战
linux·运维·服务器·开发语言·网络·c++·http