Linux的timerfd分析

 2023-10-07 阅读 23 评论 0

摘要:2019獨角獸企業重金招聘Python工程師標準>>> timerfd是Linux為用戶程序提供的一個定時器接口。這個接口基于文件描述符,所以能夠被用于select/poll的應用場景。 1.??????使用方法 timerfd提供了如下接口供用戶使用 timerfd_create int timerfd_create(int cl

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

timerfdLinux為用戶程序提供的一個定時器接口。這個接口基于文件描述符,所以能夠被用于select/poll的應用場景。

1.??????使用方法

timerfd提供了如下接口供用戶使用

timerfd_create

int timerfd_create(int clockid, int flags);

timerfd_create用于創建一個定時器文件。

參數clockid可以是CLOCK_MONOTONIC或者CLOCK_REALTIME

參數flags可以是0或者O_CLOEXEC/O_NONBLOCK

函數返回值是一個文件句柄fd

timerfd_settime

int timerfd_settime(int ufd, int flags,?const struct itimerspec * utmr, struct itimerspec * otmr);

此函數用于設置新的超時時間,并開始計時。

參數ufdtimerfd_create返回的文件句柄。

參數flags1代表設置的是絕對時間;為0代表相對時間。

參數utmr為需要設置的時間。

參數otmr為定時器這次設置之前的超時時間。

函數返回0代表設置成功。

timerfd_gettime

int timerfd_gettime(int ufd, struct itimerspec * otmr);

此函數用于獲得定時器距離下次超時還剩下的時間。如果調用時定時器已經到期,并且該定時器處于循環模式(設置超時時間時struct itimerspec::it_interval不為0),那么調用此函數之后定時器重新開始計時。

read

timerfd為阻塞方式時,read函數將被阻塞,直到定時器超時。

函數返回值大于0,代表定時器超時;否則,代表沒有超時(被信號喚醒,等等)。

poll/close

pollclose與標準文件操作相同。

2.??????內核實現

timerfd的內核實現代碼在kernel/fs/timerfd.c,它的實現基于Linuxhrtimer

timerfd_create的實現

SYSCALL_DEFINE2(timerfd_create, int, clockid, int, flags)

l?????????做一些定時器的初始化工作

l?????????調用hrtimer_init初始化一個hrtimer

l?????????調用anon_inode_getfd分配一個dentry,并得到一個文件號fd,同時傳入timerfd的文件操作指針struct file_operations timerfd_fopsanno_inode_getfd是文件系統anon_inodefs的一個幫助函數。anon文件系統比較簡單,整個文件系統只有一個inode節點,其實現代碼可以在fs/anon_inodes.c中找到。

timerfd_settime的實現

timerfd_settime最終會調用hrtimer_start啟動定時器,其超時函數被設置為timerfd_tmrproc

timerfd_tmrproc

timefd_tmrproctimerfd的定時器超時函數。在timerfd超時時,該函數會設置定時器超時標記位;增加定時器超時次數(在設置定時器循環模式時,可能會出現多次超時沒有被處理的情況);喚醒一個等待隊列,從而喚醒可能存在的正被阻塞的readselect

timerfd_fops

static const struct file_operations timerfd_fops = {

???????.release????= timerfd_release,

???????.poll????????= timerfd_poll,

???????.read??????????????= timerfd_read,

};

timerfd_read函數是文件操作read的內核實現,讀到的是定時器的超時次數。該函數在阻塞模式下會把自身掛到timerfd的等待隊列中,等待定時器超時時被喚醒。

timerfd_polltimerfd的等待隊列登記到一個poll_table,從而在定時器超時時能喚醒select系統調用。

timerfd_release

timerfd_release函數釋放timerfd_create函數中申請的資源,刪除已分配的定時器。


轉載于:https://my.oschina.net/invictuslee/blog/271618

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/4/123749.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息