nanosleep納秒級延遲
//函數原型 int nanosleep(struct timespec *req, struct timespec *rem) //參數列表: // req:要求的睡眠時間 // rem:剩餘的睡眠時間 //返回值: // 0:成功;-1,失敗,errno保存錯誤代碼 //目的:納秒級別的延遲 int nano_delay(long delay) { struct timespec req, rem; long nano_delay = delay; int ret = 0; while(nano_delay > 0) { rem.tv_sec = 0; rem.tv_nsec = 0; req.tv_sec = 0; req.tv_nsec = nano_delay; if(ret = (nanosleep(&req, &rem) == -1)) { printf("nanosleep failed.\n"); } nano_delay = rem.tv_nsec; }; return ret; } //測試,納秒級延遲的誤差率 int main() { int ret = 0; long delay = 0; struct timespec start, end, interv; for(delay = 1000; delay < 1000*1000; delay+=1000) { curr_time(&start); nano_delay(delay); curr_time(&end); diff(&start, &end, &interv); printf("delay = %ld, real delay = %ld, error = %g.\n", delay, interv.tv_sec * 1000000000 + interv.tv_nsec, (float)(interv.tv_sec * 1000000000 + interv.tv_nsec - delay)/delay ); } } //測試結果: // Duo CPU e8200 // Ubuntu 12.10 Kernel 3.4 //
最後更新:2017-04-03 14:53:40