我在以下代码中使用了timer_create()
。它将在10秒后仅触发一次处理程序。
struct itimerspec itimer = { { 0, 0 }, { 10, 0 } };
struct sigevent si;
memset (&si, 0, sizeof (struct sigevent));
si.sigev_notify = SIGEV_THREAD;
si.sigev_notify_attributes = NULL;
si.sigev_notify_function = t;
if (timer_create (CLOCK_REALTIME, &si, &timer) < 0)
{
fprintf (stderr, "[%d]: %s\n", __LINE__, strerror (errno));
exit (errno);
}
if (timer_settime (timer, 0, &itimer, NULL) < 0)
{
fprintf (stderr, "[%d]: %s\n", __LINE__, strerror (errno));
exit (errno);
}
我的问题是,10秒后我的处理程序被触发了 - 现在我是否必须在退出进程之前使用timer_delete()
删除计时器?或者,因为它只触发一次,是否需要显式删除它?
答案 0 :(得分:4)
是的,您需要明确删除计时器。
看看man(2) page for timer_create。在备注部分(特别是第三个注释)中,您将看到每次调用timer_create
都会使用内核中的资源以及所有进程中的计时器总数,可以由内核立即分配是有限的。
如果你不删除你的计时器,你最终会用完它们,任何需要分配计时器的应用程序都可能会失败。
就像内存泄漏一样 - 清理你使用的资源,否则你最终会耗尽。
回复您的后续问题
在下面的评论中,您询问是否可以从回调函数中调用timer_delete
。我不确定如何回应,所以我打开了question about it myself。答案似乎是也许。您可以尝试使用它并查看它是否有效,但我建议不要这样做。我从未见过任何从回调中删除计时器的代码,并且在事件处理完毕之前释放计时器资源的想法让我感到紧张。
此外,测试它有时可能会产生好的结果,但是由于您正在处理异步事件,因此会出现随机故障。此外,您的主程序需要运行,直到回调完成(它们在相同的进程中运行,只是不同的线程),因此您也可以在退出之前删除主线程中的计时器。我认为它是更安全的解决方案,并且更容易调试。