簡単な紹介
- timerfdインタフェースはバージョン2.6からLinuxカーネルがタイマ・インタフェースを提供し始めている、それはアプリケーション層のタイマモジュールを実装するのに適しています
利点
- コア内の高精度は、スリープタイマーの遅延機能が異なるなど、時間精度は非常に高く、
- 使い方は簡単、カーネルの実装での処理時間は、アプリケーション層は、多くの処理を必要としません。
- インタフェースは、選択/投票/ファイルディスクリプタ管理のためのファイル記述子に基づいています
インターフェイス説明
ヘッダ
sys/timerfd.h
タイマーを作成します。
int timerfd_create(int clockid, int flags);
- セットアップ時間のclockidタイプ、2つのオプションがあります
- CLOCK_REALTIME :.システム全体のリアルタイムクロックリアルタイムクロック、リアルタイム
- CLOCK_MONOTONIC:時間にシステムが起動を開始した後、調整しないと、システムクロックが変化に影響されないリセット決して
- フラグは0又はO_CLOEXEC / O_NONBLOCKであってもよいです。
- 戻り値:timerfd(ファイルディスクリプタ)
タイマーを設定します。
struct timespec {
time_t tv_sec; /* Seconds */
long tv_nsec; /* Nanoseconds */
};
struct itimerspec {
struct timespec it_interval; /* Interval for periodic timer (定时间隔周期)*/
struct timespec it_value; /* Initial expiration (第一次超时时间, 延时启动时间)*/
};
int timerfd_settime(int fd, int flags, const struct itimerspec *new_value, struct itimerspec *old_value);
- FD:FD引数はファイルハンドルtimerfd_create関数が返すです
- フラグ:0または1の2つのオプションがあります。
- TFD_TIMER_ABSTIMEは、例えば、絶対時間を表す:clockidフィルがCLOCK_MONOTONICある場合、TFD_TIMER_ABSTIMEは、開始後にit_value時間を表します
- 0たとえば、相対時間を表し:充填がclockid CLOCK_MONOTONICある場合、フラグ現在時刻が0になった後、にit_value時間を示します
- NEW_VALUE:NEW_VALUEパラメータは、タイマーのタイムアウト、およびタイムアウト間隔を指定します
- OLD_VALUE:OLD_VALUEがNULLでない場合、old_vlaue復帰タイマーの設定の前に時間パラメータ
のヒント:
- it_interval 0には定期的なタイマーがないことを示します。
- it_valueた時にit_interval表現ストップタイマ0
タイマーのタイムアウトが残り、次回の取得
int timerfd_gettime(int fd, struct itimerspec *curr_value);
- 値がゼロである場合curr_value.it_value距離フィールドは、タイマがリリースした、次のタイムアウトを示し、関係なく設定され、フィールド値が常に相対値で示しているかどうかTFD_TIMER_ABSTIME
- curr_value.it_intervalインターバルタイマ
タイマーは、FDを読みます
uint64_t exp = 0;
read(fd, &exp, sizeof(uint64_t));
- EXPタイマー値は、すなわち、タイムアウト時間を、読み出され、実行回数
タイマーを閉じます
close(fd);
- あなたはtimerfd_settimeでタイマーを停止することができます
注意点
- timerfd_createは、最初のパラメータをclockid及び第2のパラメータフラグが容易誤解timerfd_settime
- timerfd_settime時間設定TFD_TIMER_ABSTIME(絶対時間)が、設定は、時間の特定のポイントである場合、にclock_gettime値セットCLOCK_REALTIMEまたはCLOCK_MONOTONIC timerfd_createセット取得に応じて、現在の時間との時間差を取得します。
- 0(相対時間)の場合timerfd_settime設定、時間設定は、例えば、現在の時刻に反対です。
new_value.it_value.tv_sec = 3;
new_value.it_value.tv_nsec = 0;
例