时序竟态pause函数

#include <stdio.h>
#include <signal.h>
#include <unistd.h>

/*所有信号处理函数的原型,都类此,
 *无返回值(void),只有一个参数,表示信号编号*/
void sig_alrm(int signo)
{
	/*用来占位,可以不做任何事,但这个函数存在
	 *SIGALRM信号
	 *就不执行默认动作终止进程,而做其它事情*/
}

unsigned int mysleep(unsigned int sec)
{
	struct sigaction act, old;
	unsigned int unslept;			//保存未休眠够的时间

	act.sa_handler = sig_alrm;
	sigemptyset(&act.sa_mask);		//清空
	act.sa_flags = 0;
	sigaction(SIGALRM, &act, &old);	//注册信号处理函数sig_alrm
									//同时要保存旧的处理方式

	alarm(sec);						//设置sec秒闹钟
	pause();			//进程阻塞,收到一个信号后,pause返回-1,解除阻塞

	unslept = alarm(0);	//取消旧的定时器,将剩余时间保存
	/*
	 *正常情况下,闹钟到sec秒后发送SIGALRM信号,
	 *pause函数收到信号,调用信号处理函数sig_alrm
	 *pause函数返回,此时定时器已经到时,
	 *执行unslept=alarm(0)不起作用,unslept为0
	 
	 *如果是异常情况下,定时器还没到sec秒,
	 *pause函数被别的信号唤醒,需要将定时器取消
	 *定时器返回剩余时间,也就是未休眠够的时间
	 */

	sigaction(SIGALRM, &old, NULL);	//恢复SIGALRM信号原来的处理方式
	/*因为是在实现库函数,有可能用户之前设置过SIGALRM信号的处理方式*/

	return unslept;
}

int main(void)
{
	while(1){
		mysleep(5);
		printf("Five seconds passed\n");
	}

	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值