#linux #asynchronous
#linux #асинхронный
Вопрос:
Я хочу использовать асинхронный таймер, который запускает функцию обратного вызова по истечении срока ее действия. Я хочу точность в микросекундах. мой поток кода выглядит следующим образом..
timer_t tid;
struct itimerspec val;
val.it_value.tv_sec = 0;
val.it_value.tv_nsec = 100000;
value.it_interval.tv_sec = 0;
value.it_interval.tv_nsec = 100000;
timer_create (CLOCK_REALTIME, NULL, amp;tid);
timer_connect (tid, myfunc,0);
timer_settime (tid, 0, amp;val, NULL);
and write my handle function:
myfunc(){
blah blah blah...
}
Я думаю, что timer_connect не использовался в последних версиях Linux.. Есть ли у меня альтернатива?
Спасибо,
Ответ №1:
Действительно, timer_connect не существует в последней версии Linux. На самом деле, я совершенно уверен, что он не существует ни в ОДНОЙ версии Linux, последней или нет. Некоторые поисковые запросы предполагают, что это что-то, найденное в VxWorks. Он также не найден в POSIX, FWIW.
В Linux (и POSIX) вы можете указать указатель на struct sigevent в качестве второго аргумента timer_create() (тот, который в вашем примере равен NULL). структура sigevent, в свою очередь, имеет член (*sigev_notify_function ), который, как следует из названия, является функцией, вызываемой по истечении таймера (для этого требуется, чтобы метод уведомления был SIGEV_THREAD ).
Комментарии:
1. Я пробовал то же самое и имею в виду, пока думал, есть ли у меня какая-либо альтернатива.. Большое спасибо за информацию @Janneb. Попробую это и свяжусь с вами
2. Есть ли какой-либо другой способ реализации синхронного таймера без использования сигналов?
3. Конечно, если вы не используете SIGEV_SIGNAL в качестве метода уведомления или не оставляете аргумент *evp для timer_create равным NULL .
4. Как мне получать уведомления? вы имеете в виду, что я могу зарегистрировать там любой обработчик? можете ли вы дать мне справочный код?
5. Используйте SIGEV_THREAD и укажите указатель на функцию для вызова, если вы не хотите использовать сигнал. См. kernel.org/doc/man-pages/online/pages/man2/timer_create . 2.html