GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Warum ist stat::st_size 0 für Geräte, aber gleichzeitig definiert lseek die Gerätegröße korrekt?

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.


Linux
  1. Was definiert die maximale Größe für ein einzelnes Befehlsargument?

  2. Ändern Sie die maximale Datei-Upload-Größe für PhpMyAdmin in Plesk

  3. Wie berechnet der Befehl stat die Blöcke einer Datei?

  4. Warum unterscheiden sich die md5-Hashes zweier Tarballs derselben Datei?

  5. Auf dem Gerät ist kein Speicherplatz mehr vorhanden, aber die Partition ist nur halb voll und Inodes sind verfügbar

Warum funktioniert das Parent Shell Here-Dokument nicht für Unterbefehle in Dash, aber Bash funktioniert?

Warum stimmen Ls und Hexdump nicht über die Dateigröße überein?

Holen Sie sich die Programmausführungszeit in der Shell

Holen Sie sich den chmod-Zahlenwert für eine Datei

Warum scheinen Hardlinks denselben Platz einzunehmen wie die Originale?

Linux:Wie verwende ich eine Datei gleichzeitig als Ein- und Ausgabe?