Linux C / C ++ Timer обработчик сигналов в пользовательском пространстве - PullRequest
4 голосов
/ 25 марта 2011

Мне нужна функция (например, обработчик сигнала) в Linux C / C ++, которая активируется каждые 'n' миллисекунд. Как настроить сигналы и т. Д. Для регистрации в событиях таймера с разрешением в миллисекундах.

Точность не является сверхкритической, но требуется в течение ста мс или около того.

Я новичок в Linux, и я действительно не знаю, с чего начать.

Ответы [ 2 ]

6 голосов
/ 26 марта 2011

Гораздо более безопасной альтернативой setitimer (которую POSIX 2008 отмечает OBS olete) было бы использование таймеров POSIX и запуск функции истечения таймера в потоке, а не в обработчике сигнала.Таким образом, вы не ограничены использованием только безопасных асинхронных сигналов функций.Они документированы здесь:

http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_08_05

Если вам не нравится API таймеров POSIX, вы можете вместо этого создать поток, который просто спит в цикле, и заблокировать сигнал таймера.во всех темах, кроме этой темы.Тогда вы сможете свободно использовать любые функции, которые вам нравятся, в обработчике сигналов, поскольку он будет работать в отдельном потоке, и нет опасности его прерывания небезопасной асинхронной функции.

3 голосов
/ 25 марта 2011

setitimer(2) - хорошее начало, но вы действительно хотите работать асинхронно с сигналами? В противном случае вы можете иметь основной цикл с select(2) или poll(2) и соответствующий тайм-аут.

...