Linux 环境编程 用户层定时器使用二 timer_create的使用
生活随笔
收集整理的這篇文章主要介紹了
Linux 环境编程 用户层定时器使用二 timer_create的使用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
用戶層定時器有兩種,一種是timerfd,另一種是timer_create,前者比較新,使用比較方便。
Linux環境編程 用戶層定時器使用一 timerfd的使用
https://blog.csdn.net/fuyuande/article/details/80658695
這里記錄一下timer_create的用法。
先介紹一下相關接口,再結合一個簡單的demo介紹一下使用
頭文件:#include <signal.h>#include <time.h>/* * 創建定時器* 創建POSIX定時器,不會被傳遞給子進程。編譯時候增加編譯選項 -lrt* 定時器ID存儲在timerid中,定時器ID在當前進程中是唯一的,除非定時器* 被刪除。初始化的時候定時器未啟動。* clockid定義了定時器計時的方法,有如下幾個值:* CLOCK_REALTIME : 可設置的系統范圍的實時時鐘* CLOCK_MONOTONIC : 單調遞增的時鐘,系統啟動后不會被改變* CLOCK_PROCESS_CPUTIME_ID : 用于測量當前進程(包括所有線程)CPU占用時間,包含用戶調用和系統調用,* CLOCK_THREAD_CPUTIME_ID : 用于測量當前線程CPU占用時間,包含用戶調用和系統調用* 參數sevp指出該如何通知調用者定時器超時信息,根據sevp.sigev_notify字段,該字段有如下值* SIGEV_NONE : 定時器超時后不使用異步通知,可能的情況是使用timer_gettime來監控定時器* SIGEV_SIGNAL : 一旦超時,產生一個信號,任何時候,至多只有一個信號會發送到隊列里面,可以使用timer_getoverrun來獲取超時次數* SIGEV_THREAD : 新建一個線程去處理,該線程執行sigev_notif_function為入口函數* SIGEV_THREAD_ID : linux獨有,發出一個信號,和SIG_NAL類似,只不過該信號發送到指定的線程。* NULL : 如果sevp被設置為NULL,相當于SIGEV_SIGNAL,信號是SIGALRM* 返回值,成功返回0,失敗返回-1并將錯誤碼設置到errno里 */int timer_create(clockid_t clockid, struct sigevent *sevp, timer_t *timerid);使用到的時間參數數據結構體有下面兩該個 struct timespec {time_t tv_sec; /* Seconds */long tv_nsec; /* Nanoseconds */ }; struct itimerspec {struct timespec it_interval; /* Timer interval */struct timespec it_value; /* Initial expiration */ };/** 啟動/關閉定時器* itimerspec將時間分為秒和納秒的組合* 如果參數new_value->it_value不為0,則啟動定時器。如果定時器已經啟動則覆蓋之前的定時器設置* 如果參數new_value->it_value為0則關閉定時器。* 參數new_value->it_interval用于定時器重啟的間隔,即當定時器超時后下一次超時的間隔。* 參數flags為0的話默認是相對時間,也可以使用TIMER_ABSTIME絕對時間* 成功返回0,失敗返回-1,并設置errno*/ int timer_settime(timer_t timerid, int flags, const struct itimerspec *new_value, struct itimerspec * old_value);/** 返回到下一次超時的時間間隔,如果返回0說明已經超時*/ int timer_gettime(timer_t timerid, struct itimerspec *curr_value);/** 刪除定時器* 成功返回0,失敗返回-1并設置errno*/int timer_delete(timer_t timerid);下面是一個簡單例子,創建一個定時器,超時時間1s, 超時后發出信號,超時5次后程序退出
/** Description : Linux用戶層定時器使用<二>定義一個每個1s觸發的定時器,定時器觸發后發出信號并打印,超過5次后程序自動退出。* Author : mason* Date : 201808*/#include <stdlib.h> #include <unistd.h> #include <stdio.h> #include <signal.h> #include <time.h>#define EXPIRE_MAX 5 static int expire_cnt;#define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); \} while (0)/* 定時器回調函數 */ void timer_handler() { if (expire_cnt < EXPIRE_MAX){expire_cnt++;}printf("timer expire\r\n");return; } int main(int argc, char *argv[]) {timer_t timerid;struct sigevent sev;struct itimerspec its;/* 注冊信號回調函數 */sev.sigev_notify = SIGEV_SIGNAL;sev.sigev_signo = SIGUSR1;sev.sigev_value.sival_ptr = &timerid;signal(SIGUSR1, timer_handler);/* 創建定時器 */if (timer_create(CLOCK_MONOTONIC, &sev, &timerid) == -1){errExit("timer_create");}/* 設置定時器時間參數超時1s */its.it_value.tv_sec = 1;its.it_value.tv_nsec = 0;its.it_interval.tv_sec = its.it_value.tv_sec;its.it_interval.tv_nsec = its.it_value.tv_nsec;/* 啟動定時器 */if (timer_settime(timerid, 0, &its, NULL) == -1){errExit("timer_settime");}/* 超時5次后退出 */while (expire_cnt != 5) {sleep(1);}/* 刪除定時器 */timer_delete(timerid);exit(EXIT_SUCCESS); }timer_create和timerfd相比的話,接口復雜,需要使用到信號機制,實際使用的話建議使用timerfd。
參考資料:
1. man timer_create:?https://linux.die.net/man/2/timer_create
2.?POSIX定時器:timer_settime()
?
總結
以上是生活随笔為你收集整理的Linux 环境编程 用户层定时器使用二 timer_create的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pdf 激活(急速pdf激活码)
- 下一篇: Linux 内核定时器使用 二 高精度定