Linux struct itimerval用法

beachboyy發表於2014-06-28

先看一段程式碼

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


static int count = 0;


void set_timer()
{
	struct itimerval itv;


	itv.it_value.tv_sec = 3;    //timer start after 3 seconds later
	itv.it_value.tv_usec = 0;


	itv.it_interval.tv_sec = 1;
	itv.it_interval.tv_usec = 0;


	setitimer(ITIMER_REAL,&itv,NULL);
}


void signal_handler(int m)
{
	count ++;
	printf("%d\n",count);
}


int main()
{
	signal(SIGALRM,signal_handler);
	set_timer();
	while(count < 10);
	exit(0);
	return 0;

}

這段程式碼實現的功能:3秒鐘後啟動定時器,然後每隔1秒鐘向終端列印count的遞增值,當count到10時程式退出。

結構體原型:

struct itimerval {
                struct timeval it_interval; /* next value */
                struct timeval it_value;    /* current value */
            };

struct timeval {
                long tv_sec;                /* seconds */
                long tv_usec;               /* microseconds */
            };
即:

struct itimerval {
    struct timeval it_interval; /* 計時器重啟動的間歇值 */
    struct timeval it_value;    /* 計時器安裝後首先啟動的初始值 */
};

struct timeval {
    long tv_sec;                /* 秒 */
    long tv_usec;               /* 微妙(1/1000000) */
};

再來看這個函式:

int setitimer(int which, const struct itimerval *value,struct itimerval *ovalue);

setitimer()將value指向的結構體設為計時器的當前值,如果ovalue不是NULL,將返回計時器原有值。

which:間歇計時器型別,有三種選擇

ITIMER_REAL      //數值為0,計時器的值實時遞減,傳送的訊號是SIGALRM。
ITIMER_VIRTUAL //數值為1,程式執行時遞減計時器的值,傳送的訊號是SIGVTALRM。
ITIMER_PROF     //數值為2,程式和系統執行時都遞減計時器的值,傳送的訊號是SIGPROF。

返回說明: 
成功執行時,返回0。失敗返回-1,errno被設為以下的某個值 
EFAULT:value或ovalue是不有效的指標
EINVAL:其值不是ITIMER_REAL,ITIMER_VIRTUAL 或 ITIMER_PROF之一





相關文章