000
19.06.2004, 17:44 Uhr
~Gwar
Gast
|
Hallo zusammen,
ich habe ein kleines Problem in C und frage mich, ob jemand die Lösung dafür weiss:
Folgendes Programm simuliert das Problem:
C++: |
#include <stdio.h> #include <signal.h> #include <fcntl.h> #include <stdlib.h>
int main(void) { int fd; FILE *f; char *befehl;
void alrmHndlr(int sig) { signal(SIGALRM, SIG_DFL); printf(" :-( \n"); free(befehl);
/*Kritischer Punkt*/ fclose (f); close(fd);
exit(0); } /* of Handler */
fd = 0; f = fdopen (fd, "r+");
printf(" :-) \n");
befehl = malloc(1024); signal(SIGALRM, alrmHndlr);
alarm(2);
while(fgets(befehl, 1024, f) != 0) {
printf("Befehl:%s\n", befehl);
} /* of while */ }/* of main */
|
Die while-Schleife wartet auf die Standardeingabe. Währenddessen wird aber alarm() ausgeführt und der Stream f soll geschlossen werden. Dieser scheint aber vom System nicht als bereit zum Schließen markiert zu sein, so dass Valgrind folgenden Fehler anzeigt:
Code: |
valgrind: the `impossible' happened: poll_for_ready_fds: select failed?! Basic block ctr is approximately 150000
sched status:
Thread 1: status = Runnable, associated_mx = 0x0, associated_cv = 0x0 ==3190== at 0x4017DF64: vgPlain___libc_freeres_wrapper (vg_intercept.c:870) ==3190== by 0x804A10D: alrmHndlr.0 (command.c:141) ==3190== by 0x4017C7EF: ??? (vg_hashtable.c:213) ==3190== by 0x402BEFE7: _IO_file_underflow@@GLIBC_2.1 (in /lib/libc-2.3.2.so)
|
Was ich bräuchte währe als entweder eine Möglichkeit, die while-Schleife zu verlassen oder zu signalisieren, dass das Programm nicht mehr auf fgets warten soll.
Danke im Vorraus, Gwar |