Асинхронный таймер в Linux

#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