天天看點

linux之pause函數的使用

用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;
}
           

結果:

linux之pause函數的使用

繼續閱讀