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