【问题标题】:Why timer_create throw error for SIGEV_THREAD in solaris 10?为什么 timer_create 在 solaris 10 中为 SIGEV_THREAD 抛出错误?
【发布时间】:2017-12-27 09:18:37
【问题描述】:

我通过使用 timer_create 编写了一篇文章,用于设置计时器以调用我将 sigev_notify 设置为 SIGEV_THREAD 的线程,它给了我错误 EINVAL(Invalid argument) 但是当我将 sigev_notify 设置为 SIGEV_SIGNAL 代码工作正常。

即使在 solaris 11 中,我的这段代码也可以在所有操作系统中运行,但对于 solaris 10,我会出错。

代码如下:

{
int status =0;
struct itimerspec ts;
struct sigevent se;

se.sigev_notify = SIGEV_THREAD;
se.sigev_value.sival_int = val;
se.sigev_notify_function = func;
se.sigev_notify_attributes = NULL;

status = timer_create(CLOCK_REALTIME, &se, timer_id);

ts.it_value.tv_sec = abs(delay);
ts.it_value.tv_nsec = (delay-abs(delay)) * 1e09;
ts.it_interval.tv_sec = abs(interval);
ts.it_interval.tv_nsec = (interval-abs(interval)) * 1e09;

status = timer_settime(*timer_id, 0, &ts, 0);

}

请帮我解决这个问题。

提前谢谢...

【问题讨论】:

标签: c++ c timer signals solaris-10


【解决方案1】:

根据this man-page,Solaris 10 不知道SIGEV_THREAD,但只有

sigev_notify 成员指定发生异步事件时要使用的通知机制。可以使用以下值定义 sigev_notify 成员:

SIGEV_NONE

当感兴趣的事件发生时,不会传递异步通知。

SIGEV_SIGNAL

当感兴趣的事件发生时,会生成一个排队信号,其值由应用程序定义。

SIGEV_PORT

当感兴趣的事件发生时,将向事件端口发送异步通知。 sival_ptr 成员指向 port_notify_t 结构(请参阅 port_associate(3C))。事件端口标识符以及应用程序定义的 cookie 是 port_notify_t 结构的一部分

【讨论】:

  • 非常感谢您的帮助,根据我的要求,我想在特定时间段调用一个函数,我对 SIGEV_PORT 不太了解,所以我可以使用它,如果可以,请指导我.
  • Solaris 11 似乎支持SIGEV_THREAD:docs.oracle.com/cd/E86824_01/html/E54772/…
  • 在 solaris 11 中,我的代码运行良好。但我怀疑 timer.h 和 signal.h 是在 glibc 下定义的,那么为什么它们在 solaris 10 但在 solairs 11 中不支持。我打印了 SIGEV_THREAD 宏,它在 solaris 10 中将值设为 3。
  • @ram:标题只是糖。如果实现 cake 的库不处理它,就无法说服它这样做。
  • 还有其他方法可以在 solaris 10 中安排我的功能吗??
猜你喜欢
  • 1970-01-01
  • 2022-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-25
  • 1970-01-01
  • 2023-04-11
  • 2016-02-16
相关资源
最近更新 更多