Hallo
Ich habe folgendes Problem:
Ich möchte unter Linux über die serielle Schnittstelle kommunizieren und dazu benutze ich den canonical read. Wenn jetzt die Gegenseite nichts sendet bleibt das Programm am read hängen. Um das zu umgehen habe ich mittels alarm() einen timeout gesetzt. Das Programm sieht etwa so aus:
jmp_buf env;
a_function(){
signal(SIGALRM, TimeoutHandler); while(1){ if(setjmp(env) == 0){ ... alarm(1); /* 1 sec timeout */ read(fd,buf,255); /* blocking read */ alarm(0); /* timeout off */ ... } else{ ... } } }
void TimeoutHandler(int sigint){
longjmp(env,1); }
Das Programm funktioniert auch einwandfrei, allerdings nur genau einmal. Dann funktioniert der SIGALRM nicht mehr, das Programm bleibt bei read stehen. Ich hab schon alle Varianten von alarm() an und aus an verschiedenen Stellen versucht, genauso ein Rücksetzen des Signals mittels signal(SIGALRM, SIG_DFL). Außerdem hab ich das ganze mittels setitimer anstatt alarm versucht, kein Erfolg. Es wird immer nur einmal durchlaufen. Bei verschiedenen Tests hab ich dann festgestellt, dass ohne setjmp/longjmp der alarm auch öfter funktioniert, also wenn im TimeoutHandler nur ne printf Anweisung steht.
Kann mir irgendwer dazu nen Tipp geben? Muss man das SIGALRM Signal irgendwie rücksetzen oder vielleicht die env-Variable reseten?
Oder gibts noch ne andere möglichkeit einen Timeout für das serielle Lesen zu realisieren? Ich hab ein paar Versuche mit select() gemacht, das hat allerdings garnicht funktioniert.
Jegliche Hilfe ist willkommen.
Mfg. Erisch