timer_create和timerid,这是允许的吗?

时间:2014-05-24 17:48:13

标签: c++ posix

我无法将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

1 个答案:

答案 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>

此外,您应该始终检查系统调用是否存在错误,并执行除了继续操作之外的其他操作。