【Linux】使用timer_create()创建定时器发送信号并使用sigaction()处理信号

news2024/11/24 11:13:16

0x00 前言

最后更新时间:2023-10-16

0x01 主要函数及结构体介绍

1.sigaction函数

#include <signal.h>
int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact);

功能:
用于改变进程接收到特定信号后的行为。

参数:
signum:要捕获的信号
act:接收到信号之后对信号进行处理的结构体
oldact:接收到信号之后,保存原来对此信号处理的各种方式与信号(可用来做备份)。如果不需要备份,此处可以填NULL

返回值:
成功返回0,失败返回-1,errno被设置。


2.timer_create函数

#include <signal.h>
#include <time.h>
int timer_create(clockid_t clock_id, struct sigevent *evp, timer_t *timerid)

功能:
创建特定的定时器。

参数:
clock_id:可选系统的宏
evp:环境值,结构体struct sigevent变量的地址
timerid:定时器标识, 结构体timer_t变量的地址

返回值:
成功返回0,失败返回-1,errno被设置。


3.timer_settime函数

#include <time.h>
int timer_settime(timer_t timerid, int flags,
                         const struct itimerspec *new_value,
                         struct itimerspec *old_value);

功能:
将创建特定的定时器关联到一个到期时间以及启动时钟周期。

参数:
timerid:定时器标识, 结构体timer_t变量的地址
flags:为TIMER_ABSTIME,则new_value所指定的时间值会被解读成绝对值
new_value:指定时间间隔的时间,结构体itimerspec变量的地址
old_value:old_value的值不是NULL,则之前的定时器到期时间会被存入其所提供的itimerspec。如果定时器之前处在未启动状态,则此结构的成员全都会被设定成0。

返回值:
成功返回0,失败返回-1,errno被设置。

0x02 代码实现

#include <stdint.h>
#include <stdio.h>
#include <sys/types.h>
#include <string.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/signal.h>
#include <unistd.h>
#include <time.h>

void do_handle()
{
    printf("send signal\n");
}

void set_send_timer(int time)
{
    struct sigaction sig_act;
    struct sigevent sig_event;
    struct itimerspec timer_setting;
    timer_t timer_id;
    
    sigemptyset(&sig_act.sa_mask);
    sig_act.sa_flags = 0;
    sig_act.sa_handler = do_handle;
    if (sigaction(SIGRTMAX - 1, &sig_act, NULL) < 0) //The range SIGRTMIN to SIGRTMAX.
    {
        return;
    }

    // set signal event for the timer timeout.
    sig_event.sigev_notify = SIGEV_SIGNAL;
    sig_event.sigev_signo = SIGRTMAX - 1;
    if (timer_create(CLOCK_REALTIME, &sig_event, &timer_id) < 0)
    {
        return;
    }

    // timer setting. The setting can be used by more than one timer.
    timer_setting.it_value.tv_sec = 0;
    timer_setting.it_value.tv_nsec = time * 1000000;
    timer_setting.it_interval.tv_sec = 0;
    timer_setting.it_interval.tv_nsec = time * 1000000;
    if (timer_settime(timer_id, 0, &timer_setting, NULL) < 0)
    {
        return;
    }
}

int main()
{
    set_send_timer(100); // 100ms

    while (1)
    {
        sleep(1);
    }

    return 0;
}

运行结果:
编译时需加上 -lrt
在这里插入图片描述
以上。
参考文档:
1.http://kimi.it/508.html
2.https://www.cnblogs.com/muyi23333/articles/13523251.html
3.https://blog.csdn.net/qq_20853741/article/details/113547906

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1098021.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】chown命令使用

Linux chown&#xff08;英文全拼&#xff1a;change owner&#xff09;命令用于设置文件所有者和文件关联组的命令。 Linux/Unix 是多人多工操作系统&#xff0c;所有的文件皆有拥有者。利用 chown 将指定文件的拥有者改为指定的用户或组&#xff0c;用户可以是用户名或者用户…

分享微信聊天记录备份的2个方法!

很多时候&#xff0c;我们可能会因为一些原因不小心把微信聊天记录给弄丢&#xff0c;比如&#xff1a;卸载微信、清理了微信缓存、手滑误删、删除了微信好友等等。这对于常年使用微信的用户来说&#xff0c;无疑是一件头疼的事情。 为了防止意外发生导致数据丢失&#xff0c;…

Idea安装和使用教程

在本文中&#xff0c;我们将提供关于如何安装 IntelliJ IDEA 的详细步骤。如果您是初学者或只是想尝试一下 IDEA&#xff0c;我们建议您下载 Community 版。如果您需要更多高级功能&#xff0c;可以选择 Ultimate 版。 步骤一&#xff1a;下载 IntelliJ IDEA 首先&#xff0c;…

什么是运输报告?海运运输鉴定报告必须提供吗?MSDS+UN38.3报告是?

什么是运输报告&#xff1f;海运运输鉴定报告必须提供吗&#xff1f;MSDSUN38.3报告是&#xff1f; 什么是运输报告&#xff1f;海运运输鉴定报告必须提供吗&#xff1f;MSDSUN38.3报告是什么有什么区别&#xff1f; 运运输鉴定报告必须提供吗&#xff1f;一般MSDS、货物运输…

虹科方案 | 加州理工学院利用HK-TrueNAS开展地震研究

文章来源&#xff1a;虹科网络基础 阅读原文&#xff1a;https://mp.weixin.qq.com/s/jDzfSD4Px8sWecDyK8FiVw 客户背景 加州理工学院(CalTech)是世界顶尖的理工类科学研究型学府之一。加州理工学院地震实验室是加州理工学院地质与行星科学部(GPS)的一个分支机构&#xff0c;成…

云安全—云计算基础

0x00 前言 学习云安全&#xff0c;那么必然要对云计算相关的内容进行学习和了解&#xff0c;所以云安全会分为两个部分来进行&#xff0c;首先是云计算先关的内容。 0x01 云计算 广泛传播 云计算最早大范围传播是2006年&#xff0c;8月&#xff0c;在圣何塞【1】举办的SES&a…

40.同时最大在线人数问题求解(炸裂map)

思路分析&#xff1a; &#xff08;1&#xff09;对登录、登出数据构建map结构map(1, login_ts, -1, logout_ts)&#xff0c;使用炸裂函数对该map做炸裂处理 &#xff08;2&#xff09;炸裂后成为了两列&#xff0c;一列存储1or-1表示登录登出&#xff08;k&#xff09;&#x…

C++指针解读(9)-- void指针和NULL

1、void指针的概念 void * 这种指针称为“空类型指针”&#xff0c;它不指向任何具体类型的数据&#xff0c;只提供一个纯地址。void 指针必须强制类型转换成具体类型的指针才有意义。 int i 3; void* p &i;//printf(" %d\n", *p); //报错 printf(" %d\…

8月19日PMP成绩,预计10月16日公布!附查询入口、流程

PMP的考试成绩一般在考后6-8周即可查询&#xff0c;8月PMP的成绩预计会在北京时间10月16日晚上公布&#xff0c;具体时间以官方公告为准。 如何查询8月考试成绩&#xff1f; 渠道一&#xff1a;收到PMI邮件提醒 当你注册PMI所使用的邮箱收到一封PMI发来的&#xff0c;标题为…

测试培训机构「某峰」测评调查报告

测试培训机构「某峰」测评调查报告 ⭐文章简介一、机构测评之受访者介绍二、老师傅-机构测评10问&#xff01;第1问 你从哪里了解到这个培训机构&#xff1f;第2问 你为什么选择这家培训机构&#xff0c;它吸引你掏毛爷爷的点有哪些&#xff1f;第3问 回顾一下&#xff0c;从咨…

linux 学习:查找命令 find | grep

作者: 苏丙榅 原文链接: https://subingwen.cn/linux/commpress/ 在使用Linux系统的时候, 我们经常会需要查找某些文件&#xff0c;但是大多数情况下我们并不能确定这些文件的具体位置&#xff0c;这样的话就非常浪费我们的时间。Linux为我们提供了很多的用于文件搜索的命令, 如…

夜神模拟器安装教程

夜神模拟器是一款很好用的安卓模拟器&#xff0c;夜神模拟器最新版兼容性更强&#xff0c;稳定性也不错&#xff0c;简单操作使用便捷&#xff0c;可以有很好的游戏体验&#xff1a;运行完美 &#xff0c;酣畅淋漓&#xff0c;喜欢的小伙伴可以在本站下载使用&#xff0c;本期小…

binutils工具下载

一、下载binutils工具binutils-2.28.tar.bz2 https://ftp.gnu.org/gnu/binutils/ 二、解压 tar -xvjf binutils-2.28.tar.bz2三、建立build目录 在binutils-2.28下创建目录build 指定编译目录&#xff1a; ../configure --enable-debug --prefix/home/zhangchuang/ld/bin…

【TES720D-KIT】青翼自研基于复旦微FMQL20S400全国产化ARM开发套件(核心板+底板)

TES720D-KIT是专门针对我司TES720D&#xff08;基于复旦微FMQL20S400的全国产化ARM核心板&#xff09;的一套开发套件&#xff0c;它包含1个TES720D核心板&#xff0c;加上一个TES720D-EXT扩展底板。 FMQL20S400是复旦微电子研制的全可编程融合芯片&#xff0c;在单芯片内集成…

SycoTec 4061主轴维修:主轴检测与维修过程记录

主轴是机器中关键的部件之一&#xff0c;其主要作用是传递动力并驱动机器运转。由于长期使用或其它因素&#xff0c;主轴可能会出现磨损、弯曲、变形等问题&#xff0c;这些问题都会影响机器的正常运转和精度。因此&#xff0c;对主轴进行及时维修和保养对于保证机器的正常运转…

【视觉算法系列1】使用 KerasCV YOLOv8 进行红绿灯检测(上)

提示&#xff1a;免费获取本文涉及的完整代码与数据集&#xff0c;请联系助理老师 peaeci122 使用最新“KerasCV YOLOv8”模型进行红绿灯检测的综合指南 YOLO目标检测模型已经进入了无数的应用领域&#xff0c;从监控系统到自动驾驶汽车。那么&#xff0c;如果在KerasCV框架下…

01背包(一) 01背包(二)动态规划

01背包&#xff08;一&#xff09; 二维数组 题目 背包最大重量为4。 物品为&#xff1a; 重量价值物品0115物品1320物品2430 问背包能背的物品最大价值是多少&#xff1f; 创建二维数组&#xff0c;dp[i][j]的含义是任意放入前 i 个物品放进在背包重量为j的时候的最大价值…

openssl生成SM2公私钥对命令详解

&#xff08;1&#xff09;获得openssl支持椭圆曲线算法列表 命令&#xff1a;openssl ecparam -list_curves 返回结果&#xff1a; secp112r1 : SECG/WTLS curve over a 112 bit prime field secp112r2 : SECG curve over a 112 bit prime field secp128r1 : SE…

051:mapboxGL改变bearing和pitch,变换查看视角

第051个 点击查看专栏目录 本示例是介绍演示如何在vue+mapbox中改变bearing和pitch,变换查看视角。bearing:地图的默认方位角(可选,表示 地图视口正上方中心点 在地图上 北偏东 的角度。默认值为 0)。pitch:地图的默认倾斜角度(可选,默认值为 0,范围为 0 ~ 85)。 直…

《持续交付:发布可靠软件的系统方法》- 读书笔记(四)

持续交付&#xff1a;发布可靠软件的系统方法&#xff08;四&#xff09; 第 4 章 测试策略的实现4.1 引言4.2 测试的分类4.2.1 业务导向且支持开发过程的测试4.2.2 技术导向且支持开发过程的测试4.2.3 业务导向且评价项目的测试4.2.4 技术导向且评价项目的测试4.2.5 测试替身 …