Hallo,
Jens Lorenz htw9935@informatik.htw-dresden.de schrieb:
Also, saemtlichen schreibenden und lesenden Ausgaben in die Dateisysteme sind Ein- und Ausgabe-Puffer nach-/vorgeschaltet.
Soll aus einer Datei gelesen werden, wird erst im Puffer geschaut, ob der Teil der Datei schoneinmal gelesen wurde. Nur wenn die Daten nicht im Puffer sind, werden sie wirklich von der Platte gelesen ...
Entsprechend wird beim Schreiben alles zuerst in den Schreibpuffer geschrieben und erst wenn der Puffer voll ist, wirklich auf die Platten geschrieben ... (ausserdem etwa jede Minute einmal, sowie auf ausdruecklichen Wunsch)
Da muss man zwischen den Puffern im OS und den vom Programm verwalteten unterscheiden. Das was Du beschrieben hast, sind die OS-Puffer. Ob das was dorthin geschrieben ist, auch wirklich in der Datei landet, ist unabhaengig davon, ob das schreibende Programm gecrasht ist oder nicht - es kommt in jedem Fall an (Na gut, wenn das Betriebssystem oder die Hardware einen Crash hatten, dann nicht).
Dann gibt es noch die von der Laufzeitbibliothek verwalteten Puffer. Da wird im Normalfall ein Speicherbereich reserviert, in den beim Schreiben die Daten erstmal gesammelt werden, bevor sie an das Betriebssystem durchgereicht werden. Dies geschieht, damit nicht im schlimmsten Fall fuer jedes einzelne vom Programm geschriebene Byte ein Systemcall getaetigt werden muss - auf die Dauer waere das eine zeitaufwendige Sache. Wann der Puffer an das Betriebssystem uebergeben wird, entscheidet die Laufzeitbibliothek (unter Linux ist das in der Regel die libc), die Entscheidung kann aber vom Programm beeinflusst werden. (Das Lesen aus einer Datei laeuft analog ab.)
Der Crash eines Programms mit Segfault fuehrt dann dazu, dass alles, was in den libc-Puffern steht, nicht ans Betriebssystem geht (nichtmal an /dev/null ;-)) und im Hauptspeicher nur mit grossen Muehen gefunden werden kann (wenn ueberhaupt).
Mal sehen, ob das einige Klarheiten beseitigt...
Holger