read()



  • Ich hab ein kleines Problemchen. Ich möchte eine Diskette Byte für Byte auslesen, klappt auch soweit. Nur hat diese Disketten einige physikalische Fehler, welche ich nun ignorieren möchte. Ich hab immoment:

    for(int i = start; i < size; i++) {
    		if( !(i % 100) ) printf("%i von %i Bytes gelesen (%1.2f%%)\n", i, size, (i / (double)size) * 100.0);
    
    		int l = read(fd, buffer, 1);
    		if( l < 0 ) {
    			saveByte(0);
    			printf("Fehler an Position: %i\n", i);
    		} else {
    			saveByte(*buffer);
    		}
    	}
    

    Funktioniert auch, wie gesagt... Nur hängt es für jedes "kaputte" Byte gut und gerne 0.5 - 1 Minute bei read() aufruf...

    So meine Frage ist nun: Kann man für read() eine Zeitbegrenzung einstellen? Also z.B. sagen, wenn er nach drei Sekunden nix hat, dann soll er halt seine -1 (Fehler) zurück geben...?
    Oder eine andere Möglichkeit? Mit ASM oder so?

    cYa Foo[



  • Also ne Zeitbegrenzung fuer read() gibt es so direkt nicht. vll gibt es nen EINTR wenn du periodich nen SIGALRM an den prozess schicken laesst, aber das ist nicht sinn der sache.

    Ich wuerde mal behaupten fuer das was du tun willst gibt es keinen standardisierten POSIX/UNIX weg, mit linux spezifischen ioctls sollte das aber gehen,schau dir mal den quellcode von badblocks an,was ja nach fehlerhaften bloecken sucht.



  • Du koenntest alarm (2) verwenden und einen Signal-Handler aufbauen.



  • alarm() zusammen mit signal() funktioniert schonmal nicht... das read() blockiert, und erst wenn es fertig ist, dann kommt das Signal 😞

    badblocks werde ich jetzt mal angucken, vielleicht hilft mir das ja...



  • Benutze glib und mache es mit timeouts und callbacks.



  • badblock geht auch net, von glib hab ich keine Ahnung, aber ne andere Möglichkeit ist mir eingefallen... einfach das lesen via fork() in einen anderen prozess zu packen und den nach X Sekunden einfach beenden... Nuuur: wie kill ich einen anderen Thread? 🙂 ok, ich werd mal n bissle selbst gucken, trotzdem vielen dank...



  • Na was nun? Prozess oder Thread?
    Einen fork kannst du mit kill ueber die PID killen. Einen thread (angenommen es ist ein pThread) mit p_thread_cancel. Letzteres ist nicht empfehlesnwert.
    Trotzdem ist das doch eine ziemlich crappy loesung. Unwissenheit ist keine entschuldigung also setze dich mit glib/gthread/etc auseinader. 😉


Anmelden zum Antworten