Я работаю над приложением, которое задает c ограничения времени, чтобы событие происходило (в идеале точно) каждые 200 мкс. Я пытаюсь сделать это с помощью таймера и сигнала.
#include <stdio.h>
#include <time.h>
#include <signal.h>
#include <unistd.h>
#include <pthread.h>
timer_t timer_id;
void start_timer(void)
{
struct itimerspec value;
value.it_value.tv_sec = 0;
value.it_value.tv_nsec = 20000;
value.it_interval.tv_sec = 0;
value.it_interval.tv_nsec = 200000;
timer_create(CLOCK_REALTIME, NULL, &timer_id);
timer_settime(timer_id, 0, &value, NULL);
}
void handler(int sig) {
printf("in handler\n");
}
void *my_thread(void *ignore)
{
(void)ignore;
start_timer();
// Sleep forever
while(1) sleep(1000);
}
int main()
{
pthread_t thread_id;
(void) signal(SIGALRM, handler);
pthread_create(&thread_id, NULL, my_thread, NULL);
// sleep is a placeholder for this SO question. I want to do
// other processing here
sleep(5000);
printf("sleep finished\n");
}
После 200us вызывается обработчик сигнала. Похоже, что он вызывается, когда работает спящая линия (5000), потому что сообщение «сон закончен» отображается раньше. Я хочу, чтобы таймер прерывал поток, который запустил таймер, а не основной процесс. Вот почему я создал поток, чтобы начать его. Есть ли способ, чтобы сигнал прерывал только текущую инструкцию в потоке, а не в основном процессе? Я знаю, что другие потоки / процессы будут заблокированы при запуске обработчика, но я хотел, чтобы они продолжались впоследствии, как будто ничего не произошло. Например, в этом случае я хочу спать не менее 5000 секунд.