Ďá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.