我想启动一个计时器,并在它到期时调用一个函数。
google找到了很多例子,包括手册中的例子,所有的例子都使用sigaction()
来设置信号处理程序。
然而,@Patryk在this question中说,我们可以
void cbf(union sigval);
struct sigevent sev;
timer_t timer;
sev.sigev_notify = SIGEV_THREAD;
sev.sigev_notify_function = cbf; //this function will be called when timer expires
sev.sigev_value.sival_ptr = (void*) arg;//this argument will be passed to cbf
timer_create(CLOCK_MONOTONIC, &sev, &timer);
字符串
更短、更简单、更清洁、更易维护...
怎么回事?对吗?它是否只是sigaction()
的 Package 器?为什么这些示例显式地设置信号处理程序?
另外,如果我通过这个方法或者通过timer_settime
和一个信号处理程序启动一个计时器,取消计时器会导致系统删除该计时器和回调之间的关联吗?还是我必须显式地这样做?
[更新]您可以选择 * 信号或我在下面的答案中显示的方法(或两者都选,但这似乎很傻)。这是一个品味的问题。信号可能会提供更多的功能,但代价是复杂化。
如果你想做的只是启动一个计时器,并在计时器到期时得到通知,那么我的答案中的方法是最简单的。
3条答案
按热度按时间d6kp6zgx1#
Michael Kerrisk在他的《The Linux Programming Interface》一书中有一个详细的例子:
字符串
来自online source code
另外请阅读本书的第23章,这段代码在那里有非常详细的解释。
要测试上面的代码,可以输入
型
这将设置两个计时器:一个具有5秒的初始期满和5秒的间隔,另一个具有10秒的间隔。
帮助器函数的定义可以通过本书上面的源代码链接找到。
kd3sttzy2#
看起来我不需要使用信号处理程序,可以使代码更简单,如下所示:
字符串
当运行时,它给出以下输出:
型
6kkfgxo03#
Linux有Timerfd。https://lwn.net/Articles/251413/。这允许将可等待时间与select/poll/epoll一起使用。或者,您可以在select/poll/epoll上使用超时。