GNU/Linux >> Belajar Linux >  >> Linux

Mengapa stat::st_size 0 untuk perangkat tetapi pada saat yang sama lseek menentukan ukuran perangkat dengan benar?

Masalahnya ada pada detailnya... Sebagai permulaan, ada prinsip dasar desain Unix:semuanya adalah file , Dijelaskan dengan baik di sini.

Yang kedua adalah panggilan stat(2) memberi Anda inode statistik yang disimpan di sistem file tentang file khusus perangkat yang memiliki ukuran nol (anggap saja sebagai lstat(2) ). Jika Anda memiliki perangkat blok yang memiliki sistem file di dalamnya, Anda mendapatkan informasi tentangnya menggunakan statfs(2) atau getfsstat(2) atau statvfs(2) dengan sistem file/perangkat yang independen.

Berurusan dengan file khusus (biasanya berada di /dev) selalu khusus untuk sistem dan halaman manual berada di bagian 4. Jadi jika Anda ingin memanipulasi perangkat secara langsung, Anda harus membaca secara spesifik di sana. Misalnya, di Linux man 4 hd akan menunjukkan kepada Anda bagaimana berinteraksi secara terprogram dengan perangkat blok IDE. Sedangkan man 4 sd akan memberi Anda cara berinteraksi dengan disk scsi, dll.

Hal ketiga, panggilan sistem tidak seharusnya tidak konsisten dalam fungsinya NOR keterbatasan mereka.

Semoga ini membantu.


dari pertanyaan Unix Stack Exchange ini:

File perangkat bukan file itu sendiri. Mereka adalah antarmuka I/O untuk menggunakan perangkat dalam sistem operasi mirip Unix. Mereka tidak menggunakan ruang pada disk, namun mereka masih menggunakan inode seperti yang dilaporkan oleh perintah 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

Itu menyelesaikan stat bagian.

fakta bahwa Anda dapat mencari di "file" ini tidak terkait. Ini sebenarnya bukan file, tetapi Anda dapat open dan membaca dari itu. Anda juga bisa mencarinya. Ini memungkinkan untuk membaca disk pada level terendah, jadi pencarian diperlukan (itulah mengapa ini berfungsi, dan mengapa tidak mengembalikan posisi baru seperti file "nyata"?).

Menurut jawaban UnixSE lainnya ini, Anda bisa mendapatkan ukuran perangkat dengan membaca /dev/sda/size ini berkas.


Panjang "perangkat" seperti /dev/sda tidak ditentukan oleh 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. 

Jadi POSIX tidak memiliki persyaratan untuk "ukuran" perangkat disk.

Linux juga tidak menentukan stat() itu akan mengembalikan ukuran perangkat disk:

st_size

Bidang ini memberikan ukuran file (jika berupa file biasa atau tautan simbolik) dalam byte. Ukuran tautan simbolik adalah panjang nama jalur yang dikandungnya, tanpa byte null terminasi.


Linux
  1. Apa yang Mendefinisikan Ukuran Maksimum Untuk Argumen Perintah Tunggal?

  2. Mengapa "nodev" Di /etc/fstab Begitu Penting? Bagaimana Perangkat Karakter Digunakan Untuk Peretasan?

  3. Bagaimana Menyalin File Dan Membuat Direktori Target Pada Saat Yang Sama?

  1. Output Ke Stdout Dan Pada Saat Yang Sama Grep Ke File?

  2. Mengapa Volume Lvm Terenkripsi (Perangkat luks) Tidak Dapat Dipasang Saat Booting?

  3. Mengapa Dokumen Induk Shell Di Sini Tidak Berfungsi Untuk Sub-perintah Di Dash Tapi Bash Bekerja?

  1. Dapatkan waktu eksekusi program di shell

  2. Tidak ada ruang tersisa di perangkat, tetapi partisi hanya setengah penuh dan inode tersedia

  3. Mengapa tautan keras tampaknya menempati ruang yang sama dengan aslinya?