# Timer für Linux in C Programmieren



## Lemiras (7. Mai 2005)

Betriebssystem Linux,
  Hallo, 
 ich schreibe ein Programm welches Timer gesteuert Daten an das Netz senden soll. Es soll warten bis Nachrichten an eine Message Queue gesendet werden. Wenn dies nicht der fall ist (nach einer eingestellten Wartezeit ) soll der Threat Daten an einen Client senden. Soweit so gut hier tauchen die ersten Probleme auf Alarm kann ich für den Timer nicht verwenden da hier das Signal an alle Threads gehen würde und nicht nur den einen betrifft, korrigiert mich bitte wenn ich falsch liege. Auserdem soll das signal Alarm als Timeout arbeiten. Select läßt sich nicht verwenden, da hier Filedescriptoren nötig werden, was ich bräuchte währe einen Timer nur ich finde nichts wie man Timer unter Linux programmiert und wie sie funktionieren. 

  Am liebsten hätte ich was wie
  lauscht auf Message Queue;
  if(ist was angekommen == ja){
         rufe Nachricht ab und reagiere;
  } else if(timer abgelaufen) {
         sende Messwerte;
  } else {
         fehler;
  }

  Hat jemand eine Idee brauche nur einen Tipp wo ich was dadrüber finde.

  Danke schon mal
  Andre

 edit:
 eine möglichkeit währe wahrscheinlich einfach einen weiteren Threat aufzumachen der nur die Messwerte sendet. Dies währe wohl auch die einfachste aber mich interessiert es im allgemeinen ob es Timer unter Linux gibt...


----------



## Thomas Kuse (7. Mai 2005)

Direkte Timer-Programmierung in C gibt es so eigentlich gar nicht.
Dafür gibts einmal nen Link mit einem UNIX-Befehl statt Ansi-C Kommando:
http://www.codecomments.com/archive286-2004-5-194126.html

Hier hat jemand einen eigenen Timer für C geschrieben, der zwar nicht 100% genau läuft, aber dennoch eine vollständige Timerimplementation darstellt.
(nach timer im Dokument suchen)
http://home.earthlink.net/~jrhay/src/wwwsrc/src.html

Vielleicht hilft dir das weiter.

PS: sleep() gibts ja auch noch


----------



## canuzzi (7. Mai 2005)

Natuerlich kannst du einen Timer in C Programmieren. Die genannten Ungenauigkeiten kommen nicht von c, sondern von der Hardware, die beim Standardpc eben nur den Prozessortakt als Zeitzaehler bietet. Mit anderer Hardwaregrundlage laesst dich auch in c ohne Probleme etwas "genaueres" Programmieren. Im Prinzip habe ich auch sowas auch schon auf den PC gemacht, ich denke das hier auch der ungenaue PC-Prozessortakt ausreicht. Muss mal in meinen Sourcen rumwuehlen und kann dann was Posten (wahrscheinlich erst morgen...)


----------



## Slazer (8. Mai 2005)

Auch eine gute Lösung ist die variante mit select()
Nicht abschrecken lassen, dass die Funktion normal fürs Netzwerk benutzt wird, kannst dafür auch sehr gut missbrauchen.
mfg Slazer


----------



## Lemiras (13. Mai 2005)

Danke für eure Antowrten, es hat mir auch ein wenig weiter geholfen.

Ich habe jetzt einen kleinen Thread programmiert um den Zeitablauf zu steuern. Ich meine es hätte den Vorteil das ich neben dem Warten auf die Zeit bis zur Wiederholung der Messung die Messung selber laufen lassen kann und somit eine größere Genauigkeit bekomme (verinfachten) den Code habe ich hier mal reingestellt. Wenn ihr noch anmerkungen habt könnt ihr diese gern sagen. (Das ganze läuft jetzt neben der Nachrichtenverwaltung in einem eigenen Prozess)

```
#include<stdio.h>
#include<unistd.h>
#include<pthread.h>
#include<sys/types.h>
 
int time_s = 0;
long time_us = 200000;
 
void *timer(void *);
 
pthread_mutex_t start = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t wait = PTHREAD_MUTEX_INITIALIZER;
 
int alive=1;
 
int main(void){
pthread_attr_t attr;
pthread_t th;
 
pthread_attr_init(&attr);
pthread_mutex_lock(&start);
pthread_create(&th,&attr,&timer,NULL);
 
do{
 
pthread_mutex_lock(&wait);
pthread_mutex_unlock(&start);
 
/*************************
* Messwerterfassung();
***************************/
}while(alive);
 
return 0;
}
 
void *timer(void *p){
do{
pthread_mutex_lock(&start);
 
sleep(time_s);
usleep(time_us);
 
pthread_mutex_unlock(&wait);
}while(alive);
 
return p;
}
```


----------

