linux sleep alarm,Linux环境编程之信号处理(三、利用alarm()和pause()函数实现sleep()函数)...
sleep()是执行挂起一段时间,而alarm()函数是定时器,pause()函数则是挂起进程,当出现信号打断时,才会继续往前执行;
先来分享下alarm()函数,alarm()函数用来设置一个定时器,当时间超时时,会产生SIGALRM信号,该信号默认是终止该进程;
#include
unsigned int alarm(unsigned int seconds);
参数:unsigned int seconds表示经过seconds秒后会产生信号SIGALRM;
返回值:0或者以前设置的闹钟时间的余留秒数;
1、每个进程只能有一个闹钟时钟;
2、调用alarm()时,假如以前调用过alarm()函数,并且指定的时间还没到(即:还没超时,没有发送SIGALRM信号)。那么此次调用的alarm()函数会替代掉上一次的alarm()函数,并且返回值为上次调用alarm()函数中没有用完的时间;
3、本次调用alarm(0)函数会取消上一次未超时的定时器,返回剩余的时间;
下面也看看pause()函数:
#include
int pause(void);
pause()会把进程挂起来,直到一个信号处理程序执行完后,才会继续运行;
最后看看sleep()函数:
#include
unsigned int sleep(unsigned int seconds);
该函数使调用进程被挂起了,直到seconds后(超时后),或者捕捉到一个信号并且从信号处理函数返回后,该进程才能继续往下执行;返回值和alarm()函数的一样。
下面是利用alarm()函数和pause()函数来实现下sleep()函数:
#include
#include
#include
#include
static jmp_buf envAlarm;
static void myAlarm(int signo)// 自定义的SIGALRM定时器信号的处理函数
{
longjmp(envAlarm, 1);// 局部跳转
}
unsigned int mySleep(unsigned int sec)
{
unsigned int minSec, ret, tmp = 0;
if (signal(SIGALRM, myAlarm) == SIG_ERR)// 绑定SIGALRM和myAlarm()函数
return sec;
minSec = alarm(0);// 得到上一次未超时的定时器所剩的时间,防止冲刷掉上一次的真正的定时器(本函数的是实现sleep())
ret = sec > minSec ? (sec-minSec):0;// 得到返回值
if (setjmp(envAlarm) == 0){ // 局部跳转
if (minSec) // 这里考虑的是如果前面有设置定时器
alarm(minSec < sec ? minSec:sec);// 利用时间短的去做定时器
else // 如果前面没有设置定时器,则直接利用参数去挂起进程
alarm(sec);
sleep(9);// 这里是测试上一个alarm()函数到pause()之间延迟导致SIGALRM信号处理完后,pause()还没有触犯,则进程一直挂起
pause();
}
tmp = alarm(0);// 计算在睡眠时 有可能被其他信号打断,而剩下一些未睡眠的时间
if (minSec > sec){// 如果前面登记的定时器比睡眠时间长,则退出后还要把定时器复位为剩下时间的定时器
alarm(minSec-sec);// 定时器还剩多少时间,重新设置定时器
}
if (tmp)ret += tmp; // 统计所有剩余时间
return ret;
}
int main(int argc, char* argv[])
{
unsigned int otherSec;
alarm(6);
//sleep(4);
otherSec = mySleep(3);
printf("mySleep resturn:%u\n", otherSec);
return 0;
}
上面是通过局部跳转来实现sleep()函数的,当然还有使用信号屏蔽字来实现的,后面有时间会实现下。不知道上面的代码是否有漏洞,虽然这个代码量不多,但是要考虑的问题还是比较多的。如果有朋友发现了漏洞,欢迎指正!!谢谢!!
若有不正确之处,望大家指正,共同学习!谢谢!!!
linux sleep alarm,Linux环境编程之信号处理(三、利用alarm()和pause()函数实现sleep()函数)...相关推荐
- Linux环境编程之同步(三):读写锁
概述 相互排斥锁把试图进入我们称之为临界区的全部其它线程都堵塞住.该临界区通常涉及对由这些线程共享一个或多个数据的訪问或更新.读写锁在获取读写锁用于读某个数据和获取读写锁用于写直接作差别. 读写锁的分 ...
- Linux C++服务器项目——网络编程2(三次握手、四次挥手、IO多路复用)
牛客 C++高并发服务器开发 参考笔记 1 TCP三次握手 2 TCP滑动窗口 3 TCP四次挥手 在这里插入图片描述 4 TCP通信并发 5 TCP状态转换 6.端口复用 7 I/O多路复用(I/O ...
- Linux环境编程05
目录 Linux环境编程05 一.信号相关基本概念 二.信号捕获 三.进程休眠信号 四.信号集和信号阻塞 五.附带数据信息的信号处理(较难) 六.定时器 Linux环境编程05 声明:本学习笔记为个人 ...
- Linux 环境编程 用户层定时器使用二 timer_create的使用
用户层定时器有两种,一种是timerfd,另一种是timer_create,前者比较新,使用比较方便. Linux环境编程 用户层定时器使用一 timerfd的使用 https://blog.csdn ...
- linux python开发环境_如何在Linux系统中搭建Python编程环境
1 在大多数的Linux系统中,基本上都默认安装了Python,也就是说,在Linux的系统中基本上是不需要安装什么软件,就可以使用Python. 下面以ubuntu操作系统为例,看看如何在Linux ...
- Linux库概念及相关编程(动态库、静态库、环境变量)
分文件编程: 好处:分模块编程思想,功能和责任划分清楚便与调试,main函数简洁,代码易于阅读. 编程时头文件有的是使用<>这个符号括起来的,有的是" "使用的是双引号 ...
- 《Linux C编程从入门到精通》》一2.4 Linux中的调试环境gdb
本节书摘来自异步社区<<Linux C编程从入门到精通>>一书中的第2章,第2.4节,作者 宋磊 , 程钢,更多章节内容可以访问云栖社区"异步社区"公众号查 ...
- Linux环境编程姜林美,Linux环境编程习题_编程题_答案.pdf
Linux环境编程习题_编程题_答案 Linux 境编程-人民邮电出版社-姜林美 课后习题(编程题)答案 第三章 1 第五章 4 第六章 9 第七章 19 第八章 22 第九章 35 第十章 38 三 ...
- Linux 环境编程 day01 Linux系统介绍、GNU编译工具、静态/共享库、环境变量表
Linux 环境编程 day01 Linux系统介绍.GNU编译工具.静态/动态库.环境变量表 学习Linux环境编程的原因 UNIX系统介绍 Linux系统介绍 GNU工程 POSIX标准 GNU通 ...
最新文章
- 编程珠玑第四章习题答案
- SQL Server 表分区注意事项(转载)
- 在线python编程编译器-编译器python
- 代码审核工具ReviewBoard在Windows下安装问题
- Rxjs Observable.pipe 传入多个 operators 的执行逻辑分析
- html5如何绘制饼图,如何在HTML5中创建“饼图”?
- c语言生成一个大素数,for语句计算输出10000以内最大素数怎么搞最简单??各位大神们...
- css 固定列头,表格头部固定和表格列固定
- 利用微软输入法 入侵2003服务器,打开Word或Excel也可被攻击 金山卫士推送微软补丁...
- 郝兵c语言_郝斌C语言笔记——C语言概述
- 软件测试工程师要学习的基础知识,你知道多少?
- iatf16949内审员_IATF16949:2016内审员试题及答案.pdf
- wordpress 更改excerpt的长度,设置excerpt后面'[...]'的字样和链接
- 树莓派源码安装glib
- python中mysqldb的用法
- java qq邮箱登录_SpringBoot实现QQ邮箱注册和登录
- js获取ISO8601规范时间,使用UTC时间,格式为:YYYY-MM-DDThh:mm:ssZ
- MongoDB数据库的安装及使用教程
- 在线快速提取QQ群成员的QQ号码方法(无需软件操作)
- 使用kon-boot的U盘启动盘绕过系统登录密码