用pause函数和alarm函数实现sleep函数的效果,代码pause.c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <errno.h>
//本程序:用pause函数和alarm函数实现sleep函数的效果
void catch_sigalrm(int signo){
; //因为为了使调用pause函数的进程不被杀死,所以使用了信号捕捉,但是信号处理函数不用执行其他动作
}
//返回没有睡足的秒数
unsigned int mysleep(unsigned int seconds){
int ret;
struct sigaction act,oldact;
act.sa_handler = catch_sigalrm;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
ret = sigaction(SIGALRM,&act,&oldact);//要想pause函数被alarm函数发来的信号唤醒,这个信号需要被捕捉
if(ret==-1){
perror("sigaction error");
exit(1);
}
alarm(seconds);
ret = pause(); //主动挂起,等待信号唤醒
if(ret==-1 && errno==EINTR){
printf("pause sucess\n");
}
ret = alarm(0); //如果前面的alarm(seconds);定时没有结束就被异常信号打断,此时应取消定时器,返回旧闹钟余下的秒数
sigaction(SIGALRM,&oldact,NULL); //恢复SIGALRM信号旧有的处理方式
return ret;
}
int main()
{
while(1){
mysleep(3);
printf("---------------\n");
}
return 0;
}
结果: