GNU/Linux >> Znalost Linux >  >> Linux

Proč je stat::st_size 0 pro zařízení, ale zároveň lseek správně definuje velikost zařízení?

Ďábel se skrývá v detailech... Pro začátek je zde základní princip unixového designu:všechno je soubor , Zde je to pěkně vysvětleno.

Druhým je, že volání stat(2) vám dává inode statistiky uložené v souborovém systému o souboru se speciálním zařízením který má velikost nula (představte si to jako lstat(2) ). Pokud máte blokové zařízení, na kterém je souborový systém, získáte o něm informace pomocí statfs(2) nebo getfsstat(2) nebo statvfs(2) způsobem nezávislým na souborovém systému/zařízení.

Práce se speciálními soubory (obvykle umístěnými v /dev) byla vždy specifická pro systém a manuálové stránky jsou v sekci 4. Takže pokud chcete manipulovat se zařízením přímo, měli byste si přečíst podrobnosti tam. Například v Linuxu man 4 hd vám ukáže, jak programově interagovat s blokovými zařízeními IDE. Zatímco man 4 sd vám ukáže, jak pracovat s disky scsi atd.

Třetí věc, systémová volání by neměla být nekonzistentní ve své funkčnosti NOR jejich omezení.

Doufám, že to pomohlo.


z této otázky Unix Stack Exchange:

Soubory zařízení nejsou soubory samy o sobě. Jsou to I/O rozhraní pro použití zařízení v operačních systémech podobných Unixu. Nevyužívají žádné místo na disku, ale stále používají inode, jak je hlášeno příkazem stat:

$ 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

To řeší stat část.

to, že v tomto "souboru" můžete hledat, spolu nesouvisí. Toto ve skutečnosti není soubor, ale můžete open to a číst z toho. Můžete to také hledat. Umožňuje číst disk na nejnižší úrovni, takže hledání je nutné (proto to funguje a proč by to nevrátilo novou pozici jako každý "skutečný" soubor?).

Podle této další odpovědi UnixSE můžete zjistit velikost zařízení přečtením tohoto /dev/sda/size soubor.


Délka „zařízení“, například /dev/sda není specifikováno POSIX struct stat :

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. 

Takže POSIX nemá žádný požadavek na "velikost" diskového zařízení.

Linux rovněž nespecifikuje, že stat() vrátí velikost diskového zařízení:

st_size

Toto pole udává velikost souboru (pokud se jedná o běžný soubor nebo symbolický odkaz) v bajtech. Velikost symbolického odkazu je délka názvu cesty, kterou obsahuje, bez ukončovacího null bajtu.


Linux
  1. Proč je „nodev“ v /etc/fstab tak důležitý? Jak používat znaková zařízení k hackování?

  2. Jak zkopírovat soubor a vytvořit cílové adresáře současně?

  3. Výstup do Stdout a zároveň Grep do souboru?

  1. Který software pro kompresi souborů pro Linux nabízí největší zmenšení velikosti?

  2. Proč se šifrovaný svazek Lvm (zařízení Luks) nepřipojí při spouštění?

  3. Proč „zip“ v A For Loop funguje, když soubor existuje, ale ne, když neexistuje?

  1. Změňte maximální velikost nahrávání souboru pro PhpMyAdmin v Plesku

  2. Získejte čas provádění programu v shellu

  3. Jak příkaz stat vypočítá bloky souboru?