3 Stimmen

Programme benötigen, die die Verwendung von Settimer- und Alarmfunktionen in GNU C veranschaulichen

Kann jemand die Verwendung von Settimer- oder Alarmfunktionen in Gnu C veranschaulichen, mit einigen Programmbeispiele Bitte?

Ich habe ein Programm, das kontinuierlich einige Daten verarbeitet, und ich muss einen Timer / Alarm einstellen, der alle t Sekunden auslöst, in Reaktion auf die, muss ich die verarbeiteten Daten in eine Datei speichern. Dieses Schreiben der Datei muss asynchron sein < d.h. die Datenverarbeitung und das Schreiben der Datei dürfen nicht aufeinander warten > . Ich bin die GNU C Library Seiten durchgegangen, aber ich konnte nicht viel verstehen.

[EDIT]

Ich habe dieses Programm:

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

}

Aber es scheint, dass ich nichts tun kann, während der Timer an ist. Was sollte ich ändern, um meine Bedürfnisse zu erfüllen? Pl vorschlagen. [/EDIT]

9voto

liwp Punkte 6536

Hier ist ein Beispiel aus aquí die die setitimer() in regelmäßigen Abständen aufzurufen DoStuff() .

Der Schlüssel dazu ist, dass der Aufruf setitimer() führt dazu, dass das Betriebssystem eine SIGALRM das nach Ablauf der angegebenen Zeit an Ihren Prozess gesendet werden soll, und es liegt an Ihrem Programm, dieses Signal zu verarbeiten, wenn es kommt. Sie behandeln das Signal, indem Sie eine Signalbehandlungsfunktion für den Signaltyp registrieren ( DoStufF() in diesem Fall), wonach das Betriebssystem weiß, dass es diese Funktion aufrufen muss, wenn der Timer abläuft.

Sie können die setitimer() Manpage um herauszufinden, was die Argumente sind und wie man einen Timer abbricht.

Hinweis: Wenn Sie wollen, dass der Timer nur einmal ausgelöst wird, müssen Sie alarm() o ualarm() anstelle von 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");

}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X