Der Teufel steckt im Detail... Für den Anfang gibt es das Grundprinzip des Unix-Designs:Alles ist eine Datei , Schön erklärt hier.
Zweitens gibt Ihnen der stat(2)-Aufruf inode im Dateisystem gespeicherte Statistiken über die gerätespezifische Datei die eine Größe von Null hat (stellen Sie sich das als lstat(2)
vor ). Wenn Sie ein Block-Gerät haben, auf dem sich ein Dateisystem befindet, erhalten Sie Informationen darüber mit statfs(2)
oder getfsstat(2)
oder statvfs(2)
auf eine dateisystem-/geräteunabhängige Weise.
Der Umgang mit speziellen Dateien (die sich normalerweise in /dev befinden) war schon immer systemspezifisch und die Handbuchseiten befinden sich in Abschnitt 4. Wenn Sie also ein Gerät direkt manipulieren möchten, sollten Sie sich dort über die Besonderheiten informieren. Zum Beispiel unter Linux man 4 hd
zeigt Ihnen, wie Sie programmgesteuert mit IDE-Blockgeräten interagieren. Während man 4 sd
zeigt Ihnen, wie Sie mit SCSI-Discs usw. interagieren.
Drittens sollen Systemaufrufe in ihrer Funktionalität nicht inkonsistent sein NOR ihre Grenzen.
Hoffe, das hat geholfen.
aus dieser Unix-Stack-Exchange-Frage:
Gerätedateien sind per se keine Dateien. Sie sind eine E/A-Schnittstelle, um die Geräte in Unix-ähnlichen Betriebssystemen zu verwenden. Sie verwenden keinen Speicherplatz auf der Festplatte, verwenden jedoch immer noch einen Inode, wie vom Befehl stat gemeldet:
$ stat /dev/sda
File: /dev/sda
Size: 0 Blocks: 0 IO Block: 4096 block special file
Device: 6h/6d Inode: 14628 Links: 1 Device type: 8,0
Das löst die stat
Teil.
die Tatsache, dass Sie in dieser "Datei" suchen können, steht nicht im Zusammenhang. Dies ist nicht wirklich eine Datei, aber Sie können open
es und lese daraus. Sie können es auch suchen. Es erlaubt, die Festplatte auf der niedrigsten Ebene zu lesen, also ist eine Suche notwendig (deshalb funktioniert es, und warum würde es nicht die neue Position wie jede "echte" Datei zurückgeben?).
Gemäß dieser anderen UnixSE-Antwort können Sie die Gerätegröße erhalten, indem Sie diesen /dev/sda/size
lesen Datei.
Die Länge eines "Geräts" wie /dev/sda
wird nicht durch den POSIX struct stat
spezifiziert :
off_t st_size For regular files, the file size in bytes.
For symbolic links, the length in bytes of the
pathname contained in the symbolic link.
For a shared memory object, the length in bytes.
For a typed memory object, the length in bytes.
For other file types, the use of this field is
unspecified.
Daher hat POSIX keine Anforderungen an die "Größe" eines Plattengeräts.
Linux gibt diesen stat()
ebenfalls nicht an soll die Größe eines Plattengeräts zurückgeben:
st_size
Dieses Feld gibt die Größe der Datei (wenn es sich um eine reguläre Datei oder einen symbolischen Link handelt) in Byte an. Die Größe eines symbolischen Links ist die Länge des Pfadnamens, den er enthält, ohne ein abschließendes Null-Byte.