我想启动一个计时器,并在计时结束时调用一个函数。
通过谷歌搜索可以找到很多例子,包括手册中的示例,它们都使用`sigaction()`来设置信号处理程序。
然而,@Patryk在this question中说我们可以直接这样做。
哪个更短、更简单、更清洁、更易维护...?
怎么回事?这正确吗?它只是
另外,如果我通过这种方法或者通过
【更新】你可以选择信号或者我在下面回答中展示的方法(或者两者都选择,但那似乎有些愚蠢)。这是个人口味的问题。信号可能提供更多的功能,但代价是复杂化。
如果你只想启动一个计时器并在它到期时收到通知,我在回答中提供的方法是最简单的。
通过谷歌搜索可以找到很多例子,包括手册中的示例,它们都使用`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()
的一个包装器吗?为什么示例中明确设置了信号处理程序?另外,如果我通过这种方法或者通过
timer_settime
和一个信号处理程序启动一个定时器,取消定时器会导致系统删除该定时器与回调之间的关联吗?还是我需要显式地做这个操作?
【更新】你可以选择信号或者我在下面回答中展示的方法(或者两者都选择,但那似乎有些愚蠢)。这是个人口味的问题。信号可能提供更多的功能,但代价是复杂化。
如果你只想启动一个计时器并在它到期时收到通知,我在回答中提供的方法是最简单的。