нужны программы, которые иллюстрируют использование функций settimer и будильника в GNU C - PullRequest
3 голосов
/ 18 января 2010

Кто-нибудь может проиллюстрировать использование функции settimer или будильника в gnu C, с некоторыми примерами программ , пожалуйста?

У меня есть программа, которая постоянно обрабатывает некоторые данные, и мне нужноустановить таймер / будильник, который срабатывает каждые t секунд, в ответ на что мне нужно сохранить обработанные данные в файл.Эта запись в файл должна быть асинхронной <т.е. обработка данных и запись в файл не должны ждать друг друга>.Я пролистал страницы библиотеки GNU C, но я не мог понять многое ..

[EDIT]

Я получил эту программу:

#include <stdio.h>
#include <signal.h>
#include <sys/time.h>

#define INTERVAL 1

int howmany = 0;

void alarm_wakeup (int i)
{
   struct itimerval tout_val;

   signal(SIGALRM,alarm_wakeup);

   howmany += INTERVAL;

   printf("\n%d sec up partner, Wakeup!!!\n",howmany);
   tout_val.it_interval.tv_sec = 0;
   tout_val.it_interval.tv_usec = 0;
   tout_val.it_value.tv_sec = INTERVAL; /* 10 seconds timer */
   tout_val.it_value.tv_usec = 0;

   setitimer(ITIMER_REAL, &tout_val,0);

}

void exit_func (int i)
{
    signal(SIGINT,exit_func);
    printf("\nBye Bye!!!\n");
    exit(0);
}

int main ()
{
  struct itimerval tout_val;

  tout_val.it_interval.tv_sec = 0;
  tout_val.it_interval.tv_usec = 0;
  tout_val.it_value.tv_sec = INTERVAL; /* 10 seconds timer */
  tout_val.it_value.tv_usec = 0;
  setitimer(ITIMER_REAL, &tout_val,0);

  signal(SIGALRM,alarm_wakeup); /* set the Alarm signal capture */
  signal(SIGINT,exit_func);

  while (1)
  {
    //printf("!");
  }

  return 0;

}

Но похоже,я не могу ничего сделать, когда таймер включен .. Что я должен изменить, чтобы удовлетворить мои потребности?Pl предлагаю .. [/ EDIT]

1 Ответ

9 голосов
/ 18 января 2010

Вот пример из здесь , который использует setitimer() для периодического вызова DoStuff().

Ключевым моментом здесь является то, что вызов setitimer() приводит к тому, что ОС планирует SIGALRM для отправки вашему процессу по истечении заданного времени, и ваша программа должна обработать этот сигнал, когдаприходит.Вы обрабатываете сигнал, регистрируя функцию обработчика сигнала для типа сигнала (в данном случае DoStufF()), после чего ОС узнает, как вызвать эту функцию по истечении таймера.

Вы можете прочитать setitimer() man-страница , чтобы выяснить, каковы аргументы и как отменить таймер.

Примечание: если вы хотите, чтобы таймер срабатывал только один раз, вам придется вызвать alarm() или ualarm() вместо setitimer().

/*
 * setitimer.c - simple use of the interval timer
 */

#include <sys/time.h>       /* for setitimer */
#include <unistd.h>     /* for pause */
#include <signal.h>     /* for signal */

#define INTERVAL 500        /* number of milliseconds to go off */

/* function prototype */
void DoStuff(void);

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

  struct itimerval it_val;  /* for setting itimer */

  /* Upon SIGALRM, call DoStuff().
   * Set interval timer.  We want frequency in ms, 
   * but the setitimer call needs seconds and useconds. */
  if (signal(SIGALRM, (void (*)(int)) DoStuff) == SIG_ERR) {
    perror("Unable to catch SIGALRM");
    exit(1);
  }
  it_val.it_value.tv_sec =     INTERVAL/1000;
  it_val.it_value.tv_usec =    (INTERVAL*1000) % 1000000;   
  it_val.it_interval = it_val.it_value;
  if (setitimer(ITIMER_REAL, &it_val, NULL) == -1) {
    perror("error calling setitimer()");
    exit(1);
  }

  while (1) 
    pause();

}

/*
 * DoStuff
 */
void DoStuff(void) {

  printf("Timer went off.\n");

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