先上結論,測試代碼附文末:
現象及結論:
-
如果定時器定時長度小於主函數中sleep的時間,那麼sleep的睡眠時間將等於定時器定時時長。
-
如果定時器定時長度大於主函數中sleep的時間,那麼sleep的睡眠時間保持不變。
原因分析:
sleep
函數是進程阻塞函數,工作時首先將進程阻塞掉,等待硬件定時器事件到達,內核再將進程排入就緒隊列,從而喚醒進程。
博主推測,定時器定時時長小於sleep
時長時,當定時器到達定時時間,會同步喚醒進程,相當於sleep
提前結束。
博主對內核編程不太熟悉,不知理解是否正確,如果有誤還請各路大佬留言斧正(/手動抱拳)
測試代碼:
#include<iostream>
#include<sys/time.h>
#include<signal.h>
#include<unistd.h>//sleep
using namespace std;
void testFun(int a)
{
int t_ = 0;
//測試定時器任務負載對定時精度的影響
// while(1)
// {
// t_ ++;
// if( t_ > 2000000000)
// {
// cout << "t_ = " << t_ << endl;
// struct timeval curtime;
// gettimeofday(&curtime,NULL);
// cout << " curtime.tv_sec:" << curtime.tv_sec << endl;
// cout << " curtime.tv_usec:" << curtime.tv_usec << endl;
// break;
// }
// }
cout << "Hello,Linux timer~" << endl;
//exit(0);
}
int main()
{
struct timeval curtime;
gettimeofday(&curtime,NULL);
cout << "curtime.tv_sec:" << curtime.tv_sec << endl;
cout << "curtime.tv_usec:" << curtime.tv_usec << endl;
struct itimerval timer;
//週期定時器間隔
timer.it_interval.tv_sec =1;
timer.it_interval.tv_usec = 0;//0.5s=500ms=500*1000us
//從設置定時器開始到第一次定時器生效的時間
timer.it_value.tv_sec = 1;//1秒
timer.it_value.tv_usec = 0;
setitimer(ITIMER_REAL, &timer, NULL);
signal(SIGALRM, testFun);
int i = 0;
while(1)
{
i++;
//testFun(1);
cout << "背景循環次數:" << i << endl;
//usleep(1000*500);
sleep(10);
};
return 0;
}