Linux C таймер - сигнал прерывает текущий процесс - PullRequest
3 голосов
/ 11 апреля 2020

Я работаю над приложением, которое задает 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 секунд.

1 Ответ

4 голосов
/ 11 апреля 2020

Да, вы можете заблокировать сигнал (pthread_sigmask) в главном потоке перед запуском любых других потоков и разблокировать его только в потоке, предназначенном для его обработки. Это гарантирует, что он поступит в потоке, в котором вы его хотите.

Однако, если у вас уже есть потоки, вы уверены, что вам действительно нужен таймер, генерирующий для этого сигнал? clock_nanosleep должен позволять спать с пробуждением в точное время и избегать всех ужасных сигналов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...