Potřebujeme programy, které ilustrují použití SetTimer a poplachových funkcí v GNU C

hlasů
2

Může někdo ilustrují použití SetTimer nebo poplachem v GNU C, s některými příklady programů , prosím?

Mám program, který průběžně zpracovává některé údaje, a musím nastavit časovač / budík, který jede z každých t sekund, v reakci na které musím uložit zpracovaných dat do souboru. To psaní soubor má být asynchronní <tj zpracování dat a psaní souboru nesmí čekat na sebe>. Prošel jsem stránkách GNU C Library, ale nemohl jsem pochopit moc ..

[UPRAVIT]

Dostal jsem tento program:

#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;

}

Ale zdá se, jako nemohu dělat nic, když je časovač na .. Co bych měl upravit tak, aby vyhovovaly mé potřeby? Pl navrhnout .. [/ EDIT]

Položena 18/01/2010 v 14:01
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
8

Zde je příklad ze tu , která využívá setitimer()pravidelně volat DoStuff().

Klíčem je zde, že volající setitimer()má za následek plánování OS A SIGALRM, které mají být odeslány do procesu po uplynutí určeného času, a to až do svého programu zvládnout ten signál, když přijde. Zvládnout signál registrací funkci zpracování signálu pro daný typ signálu ( DoStufF()v tomto případě), po kterém operační systém bude vědět volat tuto funkci po vypršení časovače.

Můžete si přečíst setitimer() manuálové stránky , aby zjistili, jaké jsou argumenty a jak zrušit časovač.

Poznámka: Pokud chcete, aby časovač spustit pouze jednou, budete muset zavolat alarm()nebo ualarm()místo 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");

}
Odpovězeno 18/01/2010 v 14:30
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more