alarm and pause Functions
来源:互联网 发布:淘宝咸鱼卖东西安全吗 编辑:程序博客网 时间:2024/06/10 03:52
The alarm function allows us to set a timer that will expire(中止) at a specified time in the future.
When the timer expires, the SIGALRM signal is generated. If we ignore or don’t catch this signal, its default action is to terminate the process.
#include <unistd.h>unsigned int alarm(unsigned int seconds); //Return:0 or number of seconds until previously set alarm
alarm参数
调用alarm
会使得之前调用alarm
的参数 seconds 返回。如果seconds
参数为0,之前的alarm clock
取消。
The pause function suspends the calling process until a signal is caught.
#include <unistd.h>int pause(void); //Returns: −1 with errno set to EINTR
Example
1. 利用stejmp和longjmp解决sleep的race condition问题
static jmp_buf env_alrm;static void sig_alrm(int signo){ longjmp(env_alrm, 1);}unsigned int sleep2(unsigned int seconds){ if (signal(SIGALRM, sig_alrm) == SIG_ERR) return(seconds); if (setjmp(env_alrm) == 0) { alarm(seconds); /* start the timer */ pause(); /* next caught signal wakes us up */ } return(alarm(0)); /* turn off timer, return unslept time */}
解决了在调用pause之前就已经触发了signal handler
,而导致pause永久阻塞下去的问题。
潜在问题
- 使用
setjmp
和longjmp
会导致sleep
中止掉其他signal handlers
- 调用者已经有
alarm set
,之前的alarm
会被清除 - 我们该变了SIGALRM的disposition(序列)
2. reading one line from standard input and writing it to standard output.
我们有时在read
会需要当超过一定时间直接返回的功能。
static void sig_alrm(int);int main(void){ int n; char line[MAXLINE]; if (signal(SIGALRM, sig_alrm) == SIG_ERR) err_sys("signal(SIGALRM) error"); alarm(10); if ((n = read(STDIN_FILENO, line, MAXLINE)) < 0) err_sys("read error"); alarm(0); write(STDOUT_FILENO, line, n); exit(0);}static void sig_alrm(int signo){ /* nothing to do, just return to interrupt the read */}
问题如下:
- alarm和read可能会出现竞争导致,read一直阻塞
- 如果read能自动重启,定时将毫无意义
0 0
- alarm and pause Functions
- alarm pause 的用法
- alarm和pause函数
- alarm()和pause()
- alarm和pause函数
- alarm和pause函数
- linux 信号 alarm和pause
- Linux下alarm,sigaction,pause
- Linux Signal (4): alarm和pause
- Linux Signal (4): alarm和pause
- Linux Signal (4): alarm和pause
- 捉拿信号的alarm和pause函数
- alarm pause 定时器的很简单介绍
- apue-alarm和pause函数,关于信号
- Linux Signal (4): alarm和pause
- APUE笔记:alarm和pause竞争
- 利用函数alarm和pause模拟sleep
- Linux Signal (7): 捕获信号的alarm和pause函数
- $.ajax属性及用法
- Linux 多线程与进程间通信 实例 1
- Swift快速入门(五)集合
- hybrid App开发中关于返回键的逻辑控制
- my97datepicker日期限制
- alarm and pause Functions
- Linux3.5内核以后的路由下一跳缓存
- sqlite操作指南
- 蓝桥杯 第三届 奇怪的比赛
- SQLiteDatabase里面的简单操作数据库的方法
- 前端素材解析—利用linear制作复杂的边框效果
- eclipse安装svn插件
- [Java]读取文件方法大全
- 获取XIB和Storyboard生成的控件