天天看點

linux之setitimer函數實作alarm函數的作用

1.alarm函數

a.原型:unsigned int alarm(unsigned int seconds);

b.傳回值:傳回 0 或上一個 alarm 剩餘的秒數,無失敗。

c.作用:設定定時器(鬧鐘)。在指定 seconds 後,核心會給目前程序發送 14)SIGALRM 信号。程序收到該信号,預設動作終止。

2.setitimer函數

原型:int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);

a.參數:

        which:指定定時方式

                常用:自然定時: ITIMER_REAL → 14)SIGLARM-------------計算自然時間

        struct itimerval的結構:

struct itimerval{
	struct timeval{
		it_interval.tv_sec;
		it_interval.tv_usec;
	}it_interval;

	struct timeval{
		it_value.tv_sec;
		it_value.tv_usec;
	}it_value;
}it,oldit;
           

        it_interval:用來設定兩次定時任務之間間隔的時間。

        it_value:定時的時長 

b.傳回值:成功: 0;失敗: -1,設定 errno

c.作用:設定定時器(鬧鐘)。 可代替 alarm 函數。精度微秒 us,可以實作周期定時。

代碼:setitimer.c 用setitimer函數實作alarm函數的作用

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/time.h>

/*
	struct itimerval{
		struct timeval{
			it_interval.tv_sec;
			it_interval.tv_usec;
		}it_interval;
		
		struct timeval{
			it_value.tv_sec;
			it_value.tv_usec;
		}it_value;
	}it,oldit;
*/

//利用setitimer函數實作alarm函數的作用
unsigned int my_alarm(unsigned int sec)
{
	struct itimerval it,oldit;
	int ret;
	//it_value:定時的時長
	//it_interval:用來設定兩次定時任務之間間隔的時間
	it.it_value.tv_sec = sec;
	it.it_value.tv_usec = 0;
	it.it_interval.tv_sec = 0;
	it.it_interval.tv_usec = 0;
	//it作為傳入參數,oldit作為傳出參數(傳回鬧鐘定時所剩餘的時間)
	ret = setitimer(ITIMER_REAL,&it,&oldit);
	if(ret==-1){
		perror("setitimer");
		exit(1);
	}
	return oldit.it_value.tv_sec;
}


int main()
{
	my_alarm(1);
	for(int i=0; ;i++)
		printf("%d\n",i);


	return 0;
}
           

結果:就是電腦一秒鐘計數的個數

繼續閱讀