之前在学习一些系统定时器的时候,网上有找到一些与timerfd的相关资料。当初也有稍微做了下记录,但是并没有用到开发当中,自己也稍微实现了下通过select的方式,来监听,并做触发实现。但是代码在Y450上,而上周,刚把Y450上的chakra OS给删掉了。所以这些个东西也都没了。有时间的话,自己再补充一下吧。
今天说起这个,是因为在编译工程的时候,出现了头文件引用的问题。因为是嵌入式设备。不像电脑那样。头文件并没有在<sys/timerfd.h>中。在工程下找到了,是在linux/timerfd.h中,修改了下引用。还是有错误。然后就想起之前有查过timerfd系列的接口的信息。应该是2.6.32版本的内核相对较旧的缘故吧。不过还是可以通过syscall这个系统调用的函数来实现这些接口。相对比较复杂一些。但是内容也不多就是了。
所幸的是timerfd系列的API并不是很多,只有3个。这个系列的API的好处就是,可以将timer抽象成fd,然后,你就可以对fd进行监听。当有定时器的时间到了,就会被select监听到。这时,当然如果你有做封装的话,就可以执行对应的定时器回调之类的了。该timer的精度很很高。从man手册上的信息来看。应该是达到纳秒的精度。当然,很经常的时候,并不需要这么高的精度。此次记录下这些信息的话,还有一个就是可以了解到一些关于系统调用方面的知识吧。
#include <sys/syscall.h> #define TFD_TIMER_ABSTIME (1 << 0) int timerfd_create(int clockid, int flags) { return syscall(__NR_timerfd_create, clockid, flags); } int timerfd_settime(int ufc, int flags, const struct itimerspec *utmr, struct itimerspec *otmr) { return syscall(__NR_timerfd_settime, ufc, flags, utmr, otmr); } int timerfd_gettime(int ufc, struct itimerspec *otmr) { return syscall(__NR_timerfd_gettime, ufc, otmr); }
其实重要的,就这么几行。也就是通过对syscall进行一层的封装。也就达到了timerfd系列API的实现了。这样就会解决出现直接引用头文件而出现的错误。
这些代码,其实是从别人那边抠出来的。具体的话,那个大神是有写了测试代码:timerfd-test2.c
我自己也把man手册里面的代码给扣了出来。如果懒得敲的话,也可以直接在我这边下载:https://elkpi.com/demo_src/timerfd_demo.c
转载请注明: 转载自elkPi.com
本文链接地址: timerfd系统调用在2.6.32版本内核上调用的问题