我无法将evp
参数设置为NULL
,但我希望在我的计时器处理程序中收到timerid
,就好像它曾经设为NULL
。我正在考虑打电话:
struct sigevent se;
se.sigev_notify = SIGEV_THREAD;
se.sigev_notify_attributes = {};
se.sigev_notify_function = timer_handler;
timer_create(CLOCK_MONOTONIC, &se, &se.sigev_value);
我不确定,我是否应该这样做,即使它有效。是否有其他方法可以在计时器处理程序中获取timerid
,而无需将evp
设置为NULL
?
答案 0 :(得分:0)
这绝对无效,因为timer_t
可能比int
长。将指针传递给union也与将指针传递给它的一个成员不同。
你需要做这样的事情:
timer_t timerid;
struct sigevent se = { 0 };
se.sigev_notify = SIGEV_THREAD;
se.sigev_value.sival_ptr = &timerid;
se.sigev_notify_function = timer_handler;
if (timer_create(CLOCK_MONOTONIC, &se, &timerid) < 0)
abort(); // or whatever
// later...
if (timer_delete(timerid) < 0)
abort();
换句话说,你需要分配空间来保存timerid
,在你的sigevent
结构中松开指向它的指针,并记住在你完成它时删除它。< / p>
此外,您应该始终检查系统调用是否存在错误,并执行除了继续操作之外的其他操作。