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

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); // 100mswhile (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.mzph.cn/news/107414.shtml

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

相关文章

华为eNSP配置专题-ACL的配置

文章目录 华为eNSP配置专题-ACL的配置1、前置环境1.1、宿主机1.2、eNSP模拟器 2、基本环境搭建2.1、基本终端构成和连接2.2、各终端基本配置2.2.1、PC1和PC2的配置2.2.2、模拟互联网的路由器的配置2.2.3、财务部服务器的配置2.2.4、路由器AR1的配置 2.3、让各网段能够ping通互联…

ESP8266 Node Mcu开发板连接WIFI并上报数据到MQTT服务器——物联网应用开发

一、前言 本文主要介绍关于ESP8266 Node Mcu开发板如何连接WIFI并将本地采集的数据上传到MQTT服务器中。 大家调试可以使用MQTTBox 二、WIFI连接 首先&#xff0c;导入WIFI连接所需的头文件&#xff0c;引入所需库。 #include <ESP8266WiFi.h> 声明字符串常量&#xff0…

Vue项目路由加前缀

Vue项目路由加前缀 vue-cli3.0配置 1&#xff09;静态资源前缀 vue.config.js /module.exports 配置 publicPath&#xff1a;“/前缀” 2&#xff09;路由前缀 route/index.js export default new Router({ base:”/前缀" , }) 参考文章&#xff1a;https://blog.csd…

【00】神经网络之初始化参数

问题描述 #随机初始化权重 w12 np.random.randn(100, 784)/np.sqrt(784) 为什么除以28 回答 这里的代码是初始化一个深度学习模型中的权重矩阵w12。权重矩阵的形状是(100, 784)&#xff0c;这是一个从784个输入节点到100个隐藏节点的全连接层。 除以np.sqrt(784)是权重初始…

Qt QMovie和QLabel配合播放GIF表情包

文章目录 效果演示main函数创建MoviePlayer对象头文件movieplayer.h源文件movieplayer.cpp代码解释在Qt框架中,QMovie是用于处理动画和视频的类。所有源码已在本篇文章公布。 效果演示 main函数创建MoviePlayer对象 #include <QApplication>#include "movie

git pull and git fetch 到底有什么区别?

大家好这里是tony4geek 。 今天给大家介绍git pull and git fetch 有什么区别&#xff1f; 开发过程中大家肯定很多人都用到过git。获取代码有很多的git命令&#xff0c;最长用的命令是pull和fetch。那么问题来了他们之间到底有什么区别&#xff0c;该怎么使用呢&#xff1f;…

scratch身高统计 2023年9月中国电子学会图形化编程 少儿编程 scratch编程等级考试三级真题和答案解析

目录 scratch身高统计 一、题目要求 1、准备工作 2、功能实现 二、案例分析

docker容器内安装项目运行环境(python依赖包+allure)

目录 一、安装自动化项目依赖包1.导出项目依赖库2.上传到远程仓库3.进入jenkins容器内&#xff0c;检查是否安装git4.配置git用户信息5.生成秘钥6.把代码拉取下来7.安装python项目依赖8.运行项目 二、安装allure1.jenkins容器内安装allure&#xff0c;进入/usr/local/2.下载all…

MyBatisPlus的学习项目页面

MyBatisPlus通过扫描实体类&#xff0c;并基于反射获取实体类信息作为数据库表信息 类名驼峰转下划线作为表名 名为id的字段作为主键 变量名驼峰转下划线作为表的字段名 常见注解 TableName&#xff1a;用来指定表名 Tableld&#xff1a;用来指定表中的主键字段信息 Tabl…

修改http_charfinder.py使能在python311环境中运行

需要修改两个函数&#xff0c;第一个是init函数&#xff0c;修改如下&#xff1a; async def init(loop, address, port): # <1> # app web.Application(looploop) # <2> # app.router.add_route(GET, /, home) # <3> app web.Application(…

kong网关从入门到放弃

Kong网关是一个轻量级、快速、灵活的云名称API网关。Kong Gateway位于您的服务应用程序前面&#xff0c;可动态控制、分析和路由请求和响应。KongGateway通过使用灵活、低代码、基于插件的方法来实现您的API流量策略。 https://docs.konghq.com/gateway/latest/#features 架构…

面试题-React(十二):React中不可变数据的力量

一、不可变数据的概念 不可变数据意味着数据一旦创建&#xff0c;就不能被更改。在React中&#xff0c;每次对数据的修改都会返回一个新的数据副本&#xff0c;而不会改变原始数据。这种方式确保了数据的稳定性和一致性。 二、Props中的不可变数据 在React中&#xff0c;组件…

TikTok国际版 使用特网科技Bluestacks模拟器安装方法

特网科技Bluestacks模拟器主机 桌面自带Bluestacks模拟器 TikTok国际版Bluestacks模拟器搜索tiktot 登录google应用商店-安装TikTok 安装过程可能需要3-5分钟不等-配置过低可能会导致安装失败&#xff0c;建议升级更高内存。 安装完成-打开 安装成功APP-我的游戏查看 打开国际版…

rust: function

///file: nestd.rs ///ide: RustRover 233.8264.22 /// /// /// /***自定义函数*/ pub fn function() {println!("called my::nested::function()"); }#[allow(dead_code)] fn private_function() {println!("called my::nested::private_function()"); }/…

一百八十九、ClickHouse——在海豚调度器中执行ClickHouse建库建表语句

一、目的 由于Hive处理好的结果数据要同步到ClickHouse中&#xff0c;因此需要在在海豚调度器中执行ClickHouse的ADS层的建库建表语句 二、执行步骤 &#xff08;一&#xff09;情形一&#xff1a;ClickHouse和海豚在同一服务器上 1、直接在海豚中创建执行SQL文件脚本的工作…

iOS代码混淆-从入门到放弃

​ 目录 1. 什么是iOS代码混淆&#xff1f; 2. iOS自动代码混淆的方法是什么&#xff1f; 3. iOS代码混淆的作用是什么&#xff1f; 4. 怎么样才能做到更好的iOS代码混淆&#xff1f; 总结 参考资料 1. 什么是iOS代码混淆&#xff1f; 代码混淆是指将程序中的方法名、属…

ggplot2 -- geom_linerange 函数的简单使用

brief 需要三个参数确定一个直线&#xff0c;x轴位置&#xff0c;y轴起始位置&#xff0c;y轴结束位置。 有别于一些垂直辅助线&#xff0c;可以实现柱状图&#xff0c;瓷砖图等等。 example 实现柱状图 library(tidyverse)tibble(theta seq(from 0, to 1, by .1),prio…

Jmeter之Bean shell使用详解

一、什么是Bean Shell BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法;BeanShell是一种松散类型的脚本语言(这点和JS类似); BeanShell是用Java写成的,一个小型的、免费的、可以下载的、嵌入式的Java源代码解释器,具有对象脚本语言特性,非常精…

MySQL 约束,视图,索引及常见函数

​​​​​​ ​​​​​​​ 2-MySQL 约束,视图,索引及常见函 1 SQL约束 SQL 约束用于规定表中的数据规则。实际上就是表中数据的限制条件。是为了保证数据的完整性而实现的一套机制。 MySQL的约束种类如下&#xff1a; 非空约束&#xff1a;NOT NULL NOT NULL约束强制…

私有化部署AI智能客服,解放企业成本,提升服务效率

在信息时代&#xff0c;企业面临着服务效率提升和成本压力的双重挑战。作为一个领先品牌&#xff0c;WorkPlus致力于为企业提供私有化部署的AI智能客服解决方案。本文将深入探讨WorkPlus AI智能客服如何帮助企业解放成本、提升服务效率以及打造个性化的卓越客户体验。 AI智能客…