每次都需要调用timer_delete来删除定时器吗?

Does timer_delete need to be called to delete the timer every time?

我在下面的代码中使用了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() 删除计时器吗?或者,因为它只触发一次,所以不需要显式删除它吗?

是的,您需要明确删除计时器。

看看man(2) page for timer_create。在注释部分(特别是第三个注释),您会看到对 timer_create 的每次调用都使用内核中的资源,以及定时器的总数,跨越 all内核一次可以分配的进程是有限的。

如果您不删除您的计时器,您最终将 运行 删除它们并且 任何需要分配计时器的应用程序都可能会失败。

这就像内存泄漏 - 清理您使用的资源,否则您最终会 运行 出局。

回复您的后续问题
在下面的评论中,您询问是否可以从回调函数内部调用 timer_delete。我不确定如何回应,所以我打开了 。答案似乎是可能。你可以试着用它做实验,看看它是否有效,但我建议不要这样做。我从未见过任何从回调中删除计时器的代码,在事件处理完成之前释放计时器资源的想法让我很紧张。

此外,测试它有时可能会产生好的结果,但由于您正在处理异步事件,因此会出现随机失败。此外,您的主程序需要 运行ning 直到回调完成(它们 运行 在同一个进程中,只是不同的线程),所以您也可以在主线程之前删除计时器退出。我认为这是更安全的解决方案,并且更容易调试。