linux mysleep实现
来源:互联网 发布:macbook软件怎么下载 编辑:程序博客网 时间:2024/06/05 02:51
一、模拟sleep函数
利用pause和alarm以及信号相关接口来模拟sleep函数
1.利用sigaction改变alarm发出的信号的递达方式
2.设置闹钟
3.pause
4.闹钟响了,发送信号
5.pause出错返回
二、代码实现
1.未考虑竞态
#include <stdio.h>#include <signal.h>#include <unistd.h>void handler(void* avg){ //自定义处理动作:什么也不做!}int my_sleep(int timeout){ sigset_t set; sigemptyset(&set); struct sigaction act ,oact;//创建两种信号处理方式 act.sa_handler = handler;//捕捉信号(自定义函数) act.sa_mask = set;//信号屏蔽字(是否对某一信号阻塞) act.sa_flags = 0; sigaction(SIGALRM,&act,&oact);//将SIGALRM信号的处理方式改为自定义函数 alarm(timeout);//设置闹钟 pause();//挂起进程,直到有信号递达 int ret = alarm(0);//关闭闹钟 sigaction(SIGALRM,&oact,NULL);//恢复系统默认对SIGALRM信号的处理方式 return ret;}int main(){ while(1){ printf("I am sleeping \n"); my_sleep(2); } return 0;}
上面的代码中如果刚把闹钟设置了之后,进程就被系统切出去,执行更高优先级的进程,而且这个进程执行的时间很长。但此时闹钟响了,发送SIGALRM给进程,该信号处于未决状态,这时系统切回来了,并递达了这个信号。那么下面的pause将不会再收到alarm的信号。
所以,要考虑这种情况。即竞态条件。
2.竞态版本
#include<stdio.h>#include<unistd.h>#include<signal.h>void handler(int signo){}int mysleep(int time){ sigset_t set,oset,susmask; sigemptyset(&set); sigaddset(&set,SIGALRM); sigprocmask(SIG_BLOCK,&set,&oset); struct sigaction act; struct sigaction oact; act.sa_handler = handler; act.sa_mask = set; act.sa_flags = 0; sigaction(SIGALRM,&act,&oact); alarm(time); susmask = oset; sigdelset(&susmask,SIGALRM); sigsuspend(&susmask); int _time = alarm(0); sigaction(SIGALRM,&oact,NULL); sigprocmask(SIG_BLOCK,&oset,NULL); return _time;}int main(){ while(1){ printf("I am sleeping \n"); my_sleep(2); } return 0;}
0 0
- linux mysleep实现
- Linux C 实现mysleep数
- 【Linux】实现睡眠函数mysleep
- Linux下mysleep的实现
- 【Linux】信号的基础知识&mysleep的实现
- 【Linux】sleep函数的简单实现--mysleep
- linux编程之mysleep的实现
- Linux-MySleep函数实现与竟态条件
- 实现sleep-mysleep
- 实现睡眠函数mysleep
- mysleep的实现
- Linux中的mysleep函数
- Linux 信号之mysleep
- Linux下的mysleep
- mysleep
- mysleep
- 实验五:实现mysleep函数
- mysleep 的两种实现
- ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock'
- java数据结构与算法之平衡二叉树(AVL树)的设计与实现中的事实代码
- ubuntu安装 Jupyter notebook 显示错误: ImportError: No module named 'pysqlite2'
- Hadoop之HDFS的简单介绍及常用命令
- 弱校联盟con#7
- linux mysleep实现
- ZooKeeper源码解析(四):client如何和server连接
- python连接MySQL问题
- 100. Same Tree
- [BZOJ2648]SJY摆棋子-K-D树
- C# 入门(5) 类和结构,静态,访问器,虚成员和抽象成员,扩展方法,操作符重载,匿名类型
- CSS
- ZooKeeper源码解析(五):server端如何运行
- 传输层-TCP握手释放及确认机制