Hallo
Wild im Programm herumzuspringen ist auf jeden Fall keine gute Idee - es kann zuviel dabei schiefgehen.
Das waren auch meine bedenken, den Tip mit setjmp hab ich aber von nem Kollegen, den ich als ziemlich guten Programmierer ansehe.
//open int fd=open("/dev/ttyS0",O_RDONLY); //set non-block int flag; fcntl(fd,F_GETFL,&flag); flag|=O_NONBLOCK; fcntl(fd,F_SETFL,&flag); //read while(1){ //select for read on fd int max=fd+1; fd_set rd; FD_ZERO(&rd); FD_SET(fd,&rd); //timeout: 5s 20ms struct timeval tmout; tmout.tv_sec=5; tmout.tv_usec=20000; //select int ret=select(max,&rd,0,0,&tmout); //check whether we can read if(ret>0 && FD_ISSET(fd,&rd)){ char buf[256]; ret=read(fd,buf,sizeof(buf)); if(ret>0)dosomething(buf,ret); else if(ret<0){ //error switch(errno){ case EAGAIN: case EINTR: //hmm, hickups, ignore it break; case EIO: fprintf(stderr,"I/O errors, panic!"); exit(1); break; //... } }else{//if(ret==0) fprintf(stderr,"End of stream on serial..."); exit(0); } }else{ fprintf(stderr,"timeout!"); gotosomewhereelse(); } }
Perfekt, genau das hab ich gesucht. Das funktioniert auch einwandfrei. Ich hab das mit dem select() am Anfang nich so richtig verstanden, weil auch alle Beispiele nur auf die Benutzung mehrere filedescriptors eingingen.
Achso, es hilft nicht den Handler neu zu initialisieren und setjmp liefert auch immer den richtigen return-Wert, es wird ganz einfach der alarm() nicht mehr ausgelöst.
Mfg. Erisch