我通过sys / time.h中的setitimer函数在我的C ++代码中使用了一个计时器。这将SIGALRM信号映射到我的计时器处理程序方法。在此之后我无法使用睡眠功能。我假设这是因为睡眠也使用SIGALRM信号。你能为这个问题建议任何解决方法吗?
感谢您的回复。
答案 0 :(得分:8)
来自alarm(2)
man page:
sleep()
可以使用SIGALRM
实现;混合调用alarm()
和sleep()
是一个坏主意。
某些实现不使用SIGALRM
,找到类似的机器并进行设置。否则,您可以尝试nanosleep()
;它安全地实施了。来自nanosleep(2)
man page:
与
sleep(3)
和usleep(3)
相比,nanosleep()
具有不影响任何信号的优势,它由POSIX标准化,提供更高的定时分辨率,并允许继续睡眠被信号更容易打断了。
答案 1 :(得分:3)
您可以尝试使用select()作为计时器。我不知道它是否使用SIGALRM,但它应该很容易测试。类似的东西:
timeval t = {1, 0};
select(0, NULL, NULL, NULL, &t);
答案 2 :(得分:0)
我使用的库为这些OS服务提供了抽象。我使用ACE库作为计时器和睡眠(ACE_OS::sleep
,ACE_Reactor::schedule_timeout
),它们一起工作没有任何问题。据我所知,ACE使用select
作为其计时器。我猜boost::thread::sleep和boost::asio::deadline_timer也可以成功完成任务。