2010-09-05 5 views
2

Я использую таймер в своем коде на C++ через функцию setitimer из sys/time.h. Это отображает сигнал SIGALRM методу обработчика таймера. После этого я не могу использовать функцию сна. Я предполагаю, что это потому, что сон также использует сигнал SIGALRM. Можете ли вы предложить решение этой проблемы?Использование Sleep() при использовании таймеров через setitimer

Спасибо, что ответили.

+0

+1 Я уверен, что рано или поздно я столкнусь с этой проблемой. – FireAphis

ответ

3

Вы можете использовать select() как таймер. Я не знаю, использует ли он SIGALRM или нет, но это должно быть просто проверить. Что-то вроде:

timeval t = {1, 0}; 

    select(0, NULL, NULL, NULL, &t); 
+0

ACE использует выбор для реализации таймера, поэтому, я думаю, ваше предложение должно работать. – FireAphis

6

От alarm(2)man page:

sleep() могут быть реализованы с использованием SIGALRM; смешение звонков до alarm() и sleep() - плохая идея.

Некоторые реализации не используют SIGALRM, найдите такую ​​машину, и вы настроены. В противном случае вы можете попробовать nanosleep(); он реализован безопасно. Из nanosleep(2)man page:

По сравнению с sleep(3) и usleep(3), nanosleep() имеет преимущество, что не влияет на любые сигналы, стандартизирован по стандарту POSIX, она обеспечивает более высокое разрешение по времени, и это позволяет продолжить сон, который был прерван по сигналу легче.

+0

Нанолеп - путь. – SkypeMeSM

0

Я бы использовал библиотеку, которая предоставляет абстракцию этим службам ОС. Я использую библиотеку ACE для таймеров и спит (ACE_OS::sleep, ACE_Reactor::schedule_timeout), и они работают вместе без проблем. Насколько я знаю, ACE использует select для своих таймеров. Я думаю, boost::thread::sleep и boost::asio::deadline_timer также выполнит задачу.

+0

К сожалению, мне не нужны сторонние библиотеки. Я не могу использовать Boost или ACE :( – SkypeMeSM

+0

Ну, тогда я думаю, Карл просто дал окончательный ответ :) (бежит к своему посту, чтобы проголосовать за него). – FireAphis

Смежные вопросы