Linux系统定时信号SIGALRM的触发与alarm函数的使用

news2024/9/26 1:21:54

1、 定时信号SIGALRM的用途

在编程的过程中,很多时候我们需要为程序设置一个闹钟,然后到了闹钟设定的时刻然后再去采取相关的操作。比如进行socket编程时,如果客户端长时间没有与服务器进行交互,需要服务器在一定时间之后主动关闭socket连接。在这种场景下,就可以在服务器收到客户端的socket的连接时,设置一个定时信号,然后在定时信号到来时,关闭掉socket连接即可。

2、定时信号SIGALRM的触发

通过alarm函数触发定时信号,在linux系统中,alarm函数需要的头文件为:

#include <unistd.h>

函数原型如下:

unsigned int alarm(unsigned int seconds)
/* 
参数:
	seconds:表示在当前时刻seconds秒之后产生一个SIGALRM信号,若seconds=0,表示取消闹钟
返回值:
0或者一个大于0的值。若值大于0,表示上一个定时器还剩余多少秒。比如:
int ret1 = alarm(10);    // 第0秒时刻,设定一个定时闹钟,准备10秒后触发SIGALRM信号, 此时返回值为0
sleep(5);
int ret2 = alarm(20); // 重新设定闹钟,定时信号将会在第25秒触发,此时ret2=5,表示上个闹钟还剩余5秒
*/

几点说明:

  • 闹钟信号只会触发一次,若想循环触发,可以在闹钟到时后重新通过alarm函数触发
  • 可以重新设置闹钟信号,即在上一个闹钟到时之前,通过alarm函数重新设定响铃时刻或取消闹钟

3、定时信号的响应与捕捉

3.1 系统默认对SIGALRM信号的响应

如果不对SIGALRM信号进行捕捉或采取措施,默认情况下,闹钟响铃时刻会退出程序。观察下面的程序:

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
int main() {
  	int t = alarm( 5 );   // 设定闹钟5秒之后响铃
  	printf("set alarmer: %d \n", t);
  	sleep(2);
  	int ret = alarm(4);   // 重新设定闹钟4秒之后响铃,上一个闹钟还剩3秒
  	printf("reset alarmer: %d \n", ret);
   	int i;
	for ( i = 0; i < 15; i++ )
	{
	  	printf( " sleep % d ... \n ", i );
		sleep( 1 );
	}
	return 0;
}

打印如下:
在这里插入图片描述
从上面可以看到,重新设定闹钟在4秒之后响铃,4秒之后,屏幕打印:Alarm clock,
然后程序就退出了。

3.2 设置SIGALRM信号的响应函数

既然设定闹钟信号,肯定是希望在闹钟响铃的时刻采取一定的操作,这个操作自然是通过执行某个函数来实现。因此,我们需要为SIGALRM信号设定一定响应函数(回调函数),然后响铃的时候就会执行该函数。
信号回调函数的设置是通过sinal函数来进行的。需要对头文件为signal.h,signal.h是C标准函数库中的信号处理部分,定义了程序执行时如何处理不同的信号。函数原型如下:

// 位于头文件 signal.h
// Type of a signal handler
typedef void (*__sighandler_t)(int);
__sighandler_t signal(int __sig, __sighandler_t __handler);
/*
入参:
	__sig:表示要捕捉的信号,如果要捕捉SIGALRM信号,这里填SIGALRM即可
	__handler:回调函数(其实还可以设置其它值,具体见参考文章1)
返回值:
	返回指向回调函数的函数指针,若有错误则返回SIG_ERR	(-1)
*/

示例如下:

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
 
/*闹钟信号处理函数*/
void sig_handler() {
	printf( "hello world! \n " );
}
int main() {
	signal( SIGALRM, sig_handler );
  	int t = alarm( 5 );
  	printf("set alarmer: %d \n", t);
  	sleep(2);
  	int ret = alarm(4);
  	printf("reset alarmer: %d \n", ret);
	for (int i; i = 0; i < 15; i++ )
	{
		printf( " sleep % d ... \n ", i );
		sleep( 1 );
	}
	return 0;
}

打印如下:
可以看到,定时信号到时,调用了响应函数sig_handler,并打印出了hello world,然后程序继续执行。
在这里插入图片描述

【参考文章】
1、https://blog.csdn.net/yyyljw/article/details/80741264

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

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

相关文章

Linux | 权限管理

啊我摔倒了..有没有人扶我起来学习.... &#x1f471;个人主页&#xff1a;《CGod的个人主页》\color{Darkorange}{《CGod的个人主页》}《CGod的个人主页》交个朋友叭~ &#x1f492;个人社区&#xff1a;《编程成神技术交流社区》\color{Darkorange}{《编程成神技术交流社区》…

Vue(二)

1. 模板语法 1.1 实现效果 1.2 模板的理解 不加v-bind就相当于直接把双引号里的东西当成字符串执行&#xff0c;加了bind双引号里的东西就当成js表达式执行 v-bind:可以简写成&#xff1a; 起始标签和结束标签中间夹着的就是标签体 <!DOCTYPE html> <html><hea…

【数据结构】插入排序、希尔排序、冒泡排序、选择排序

文章目录 一、直接插入排序 思想 程序代码 时间复杂度 二、希尔排序 思想 程序代码 时间复杂度 三、冒泡排序 思想 程序代码 时间复杂度 四、选择排序 思想 程序代码 时间复杂度 一、直接插入排序 思想 直接插入排序有些类似于我们玩扑克牌时的整理牌序动作&a…

目标检测中常见的神经网络组成层------Pytorch

物体检测中常见的神经网络组成层 文章目录物体检测中常见的神经网络组成层卷积层激活函数层池化层Dropout层全连接层常见的物体检测算法常用卷积层、池化层、全连接层、激活函数层、Dropout层。 卷积层 CNN–各层的介绍_Miracle Fan的博客-CSDN博客_cnn各层介绍 在pytorch中…

Python3入门基础(08)一个函数

Python3 函数 函数是组织好的&#xff0c;可重复使用的&#xff0c;用来实现单一&#xff0c;或相关联功能的代码段。 函数能提高应用的模块性&#xff0c;和代码的重复利用率。你已经知道Python提供了许多内建函数&#xff0c;比如print()。但你也可以自己创建函数&#xff0…

Windows 11 连接 hercules zOS Websphere MQ 配置

基本配置 zOS v1.10 基本配置可以先参考下面教程 ubuntu 编译 hercules 主机安装 z/OS 教程 zOS MQ 版本为 CSQ700 Windows 11 IBM MQ 版本为最新 9.x IBM MQ 官网有开发者版本可以免费下载&#xff0c;档名如下 mqadv_dev931_windows.zip (全名为 IBM MQ Advanced for Devel…

kafka — 2、基础环境搭建

前述 kafka的运行依赖于zooKeeper&#xff0c;所以在搭建kafka的环境之前需要搭建zookeeper环境。 zooKeeper&#xff1a; ZooKeeper是一个分布式协调服务&#xff0c;它的主要作用是为分布式系统提供一致性服务&#xff0c;可以保证数据在集群间的事务一致性&#xff0c;提供…

Volatile不保证原子性

目录 前言 原子性 代码测试 为什么出现数值丢失 如何解决 其它解决方法 字节码指令表 前言 通过前面对JMM的介绍&#xff0c;我们知道&#xff0c;各个线程对主内存中共享变量的操作都是各个线程各自拷贝到自己的工作内存进行操作后在写回到主内存中的。 这就可能存在一…

Java Iterator(迭代器)

Java Iterator&#xff08;迭代器&#xff09;不是一个集合&#xff0c;它是一种用于访问集合的方法&#xff0c;可用于迭代 ArrayList 和 HashSet 等集合。 Iterator 是 Java 迭代器最简单的实现&#xff0c;ListIterator 是 Collection API 中的接口&#xff0c; 它扩展了 I…

微信小程序和ros2进行通信

微信小程序和ros2进行通信环境配置ubuntu下安装ros2ubuntu安装mqtt库windows安装微信开发者工具主要功能模块介绍ROS2基础程序讲解微信小程序基础程序讲解编译及运行ros2程序编译及运行微信小程序主要事项ROS2做为一款优秀的机器人操作系统软件&#xff0c;其搭载了丰富的机器人…

深耕低代码领域20年,这个老牌低代码平台有多靠谱

编者按&#xff1a;市面上低代码平台多如牛毛&#xff0c;用户在选型低代码平台时该如何甄别&#xff1f;本文通过介绍20年的老品牌低代码平台的特性&#xff0c;展示了优秀第低代码平台的魅力。 关键词&#xff1a;老厂商&#xff0c;私有化部署&#xff0c;源码交付&#xf…

实现effect的stop和onStop功能

06_实现effect的stop和onStop功能 一、实现stop &#xff08;一&#xff09;单元测试 it(stop, () > {let dummy;const obj reactive({ prop: 1 });const runner effect(() > {dummy obj.prop;});obj.prop 2;expect(dummy).toBe(2);stop(runner);obj.prop 3;expe…

zookeeper学习笔记1(小D课堂)

win和linux双环境安装zookeeper 我们不点击这个download。 进行解压&#xff1a; 我们进入到conf目录。 我们给这个文件进行重命名。 接下来我们去打开它&#xff0c;去修改一下配置&#xff1a; 我们先去掉这部分注释。 去掉注释&#xff0c;一共就这些内容。 tickTime是我们的…

如何开通阿里云语音通知服务?

阿里云语音服务是阿里云为用户提供的一种通信服务的能力。支持快速发送语音通知服务。 安全级别更高&#xff0c;难窃取。支持大容量、高并发&#xff0c;稳定可靠。 一、如何开通阿里云语音服务&#xff1f; 注册阿里云平台账户&#xff1b;实名登记认证&#xff1b;阿里云语…

手把手教你 如何利用github搭建个人网站 无需服务器

目录 前言 准备工作 教程来啦&#xff01;&#xff01;&#xff01; 第一部分 第二部分 链接说明 前言 哈喽&#xff0c;大家好&#xff0c;我是木易巷。 今天给大家分享一下&#xff1a;如何使用GitHub创建自己的个人网站&#xff1f; 准备工作 需要使用GitHub&#xff0c;当…

【python】语法分析-化学分子式解析「编译原理」

题目 编写程序&#xff0c;计算化学分子式中元素的数目&#xff0c;并完成以下测试&#xff1a; atom_count(“He”) 1 atom_count(“H2”) 2 atom_count(“H2SO4”) 7 atom_count(“CH3COOH”) 8 atom_count(“NaCl”) 2 atom_count(“C60H60”) 120 参考语法 specie…

学习周报-20221230

文章目录一 如何设置字符集二 NFS配置文件父目录权限影响子目录三 对IP分组可以批量管理NFS客户端首先查看系统环境 [rootnfs-server ~]# cat /etc/redhat-release Red Hat Enterprise Linux release 8.7 (Ootpa) [rootnfs-server ~]# uname -r 4.18.0-425.3.1.el8.x86_64这是…

JAVA零基础小白学习免费教程day13-Collection数据结构

day13_JAVAOOP 课程目标 1. 【理解】集合的体系结构 2. 【掌握】Collection集合中常用的方法 3. 【理解】Iterator迭代器 4. 【掌握】增强for的使用 5. 【理解】List集合的特点 6. 【掌握】List集合中特有的方法 7. 【理解】LinkedList集合的特点 8. 【理解】LinkedList集合中…

解读YOLO v7的代码(二)训练数据的准备

在上一篇文章解读YOLO v7的代码(一)模型结构研究_gzroy的博客-CSDN博客&#xff0c;我对Yolo v7的模型结构进行了分析&#xff0c;那么这次我们将进一步研读代码的关键部分&#xff0c;学习是如何对模型进行训练的。 训练数据的准备是模型训练的关键&#xff0c;通常我们需要对…

保姆教程系列一、什么?Redis部署 so easy

系列文章目录 &#xff01;&#xff01;&#xff01;是的没错&#xff0c;胖友们&#xff0c;保姆教程系列又更新了&#xff01;&#xff01;&#xff01; 保姆教程系列一、Redis部署 so easy 保姆教程系列二、Redis高可用&#xff08;主从同步哨兵模式&#xff09; 保姆教程系…