Как использовать setitimer с SIGALRM в C - PullRequest
0 голосов
/ 04 декабря 2018

Я пытаюсь использовать setitimer для отправки SIGALRM, который, в свою очередь, вызывает мою функцию-обработчик для печати на стандартный вывод.Я часами рыщу по интернету, и просто нет четких указаний на то, как следует использовать сетитимер.Я пробовал разные комбинации, но ни одна из них не работает.В моем коде я использую сокеты и pthreads, но я не думаю, что это действительно имеет отношение к проблеме, так как я пытаюсь установить будильник с помощью сигнала, который в любом случае остановит все потоки, поэтому я оставлю этот код дляsimplicity.

void handle_alarm(int sig){

    printf("Printing Info\n");

}


int main(int argc, char**argv){

    struct itimerval it_val;
    signal(SIGALRM, handle_alarm);
    it_val.it_value.tv_sec = 1;
    it_val.it_value.tv_usec = 1000000;  
    it_val.it_interval = it_val.it_value;
    setitimer(ITIMER_REAL, &it_val, NULL);
    while(1){}

    return 0;

}

Он должен просто печатать на терминал каждую секунду, но это не так.Кто-нибудь может дать мне какой-нибудь совет?

1 Ответ

0 голосов
/ 04 декабря 2018

Кто-нибудь может дать мне какой-нибудь совет?

Ядро может!В случае сбоя системных вызовов ядро ​​сообщает код ошибки.Libc сообщит об ошибке и установит errno соответствующим образом.Таким образом, измените

setitimer(ITIMER_REAL, &it_val, NULL);

на

if (setitimer(ITIMER_REAL, &it_val, NULL) == -1) {
  perror("setitimer");
  exit(1);
}

и посмотрите, что пошло не так.Соответствующая справочная страница будет содержать список возможных кодов ошибок и их причин:

   EFAULT new_value, old_value, or curr_value is not valid a pointer.

   EINVAL which is not one of ITIMER_REAL, ITIMER_VIRTUAL, or
          ITIMER_PROF; or (since Linux 2.6.22) one of the tv_usec fields
          in the structure pointed to by new_value contains a value
          outside the range 0 to 999999.

Исправление оставлено для учащегося в качестве упражнения.Также не привыкайте к вызову не асинхронно безопасных функций сигнала из обработчика сигнала!

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