Die Hauptschleife von GNU cat ist im einfachsten Fall (Funktion
simple_cat
von cat.c
):
while (true)
{
/* Read a block of input. */
n_read = safe_read (input_desc, buf, bufsize);
/* ... */
}
Dann wird die Frage "Wie wird bufsize
eingestellt?" Die Antwort ist die Verwendung von io_blksize
( insize = io_blksize (stat_buf)
), die wie folgt definiert ist:
io_blksize (struct stat sb)
{
return MAX (IO_BUFSIZE, ST_BLKSIZE (sb));
}
Dabei gibt ST_BLKSIZE die Vorstellung des Betriebssystems von der bevorzugten E / A-Blockgröße des Dateisystems (Zugriff über stat
), und IO_BUFSIZE ist als 128 * 1024 (128 KB) definiert. Hier ist ein Auszug aus der Linux- stat
Syscall-Dokumentation:
blksize_t st_blksize; /* blocksize for file system I/O */ (...)
The st_blksize field gives the "preferred" blocksize for efficient
file system I/O. (Writing to a file in smaller chunks may cause
an inefficient read-modify-rewrite.)
Es scheint also, dass GNU cat Blöcke von 128 KB oder die vom Dateisystem empfohlene E / A-Blockgröße einliest, je nachdem, welcher Wert größer ist.
stat(2)
.stat -f -c %s file
, um die Blockgröße des Dateisystems zu finden, in dem sich die Eingabedatei befindet? Ist die Blockgröße des Dateisystems, in das die Ausgabedatei verschoben wird, nicht von Bedeutung? Und was ist mit dem Kopieren von zB / dev / zero auf ein Raw-Block-Gerät?stat -f -c %s file
ermöglicht Ihnen den Zugriff auf diesen Wert über die Befehlszeile. Die Blockgröße des Ausgabedateisystems wird berücksichtigt. Ich habe diesen Teil entfernt, werde aber meine Antwort erweitern (der größte Teil der Ausgabegröße, der Eingabegröße und des fest codierten Werts wird verwendet). Ich sehe nicht, dass Pseudodateien wie/dev/zero
auf besondere Weise behandelt werden: GNU cat wird auch einfachstat
auf diesen verwendet.