Linux中提供的休眠函數是sleep和alarm,但是他們僅僅提供以秒為單位的休眠,這中休眠有些進程顯然太長了,那麼怎樣才能使進程以更小的時間分辨率休眠呢?
我知道的方法有2種,下面就做分別介紹。
第一種方法是使用定時器,Linux提供的定時器函數是:
int setitimer(int which, const struct itimerval *value, struct
itimerval *ovalue);
which指定那種定時器。Linux提供3種定時器:
TIMER_REAL: 准確定時器,超時會發出SIGALRM信號;
TIMER_VIRTUAL: 虛擬定時器,只記進程時間,所以會根據進程執行時間而變化,不能實現准確定時,超時發出SIGVTALRM信號;
TIMER_PROF: 梗概計時器,它會根據進程時間和系統時間而變化,不能實現准確定時,超時發出SIGPROF信號;
在進程中應該捕捉所設定時器會發出的信號,因為進程收到定時器超時發出的信號後,默認動作是終止。
value是設置定時器時間,相關結構如下:
struct itimerval {
struct timeval it_interval;
struct timeval it_value;
};
struct timeval {
long tv_sec;
long tv_usec;
};
it_interval指定間隔時間,it_value指定初始定時時間。如果只指定it_value,就是實現一次定時;如果同時指定it_interval,則超時後,系統會重新初始化it_value為it_interval,實現重復定時;兩者都清零,則會清除定時器。
tv_sec提供秒級精度,tv_usec提供微秒級精度,以值大的為先,注意1s = 1000000ms。
ovalue用來保存先前的值,常設為NULL。
如果是以setitimer提供的定時器來休眠,只需阻塞等待定時器信號就可以了。