Ini sebenarnya cukup sederhana, setidaknya jika Anda tidak memerlukan detail implementasi.
Pertama, di Linux semua sistem file (ext2, ext3, btrfs, reiserfs, tmpfs, zfs, ...) diimplementasikan dalam kernel. Beberapa mungkin membongkar pekerjaan ke kode tanah pengguna melalui FUSE, dan beberapa datang hanya dalam bentuk modul kernel ( ZFS asli adalah contoh penting dari yang terakhir karena pembatasan lisensi), tetapi bagaimanapun juga tetap ada komponen kernel. Ini adalah dasar yang penting.
Ketika sebuah program ingin membaca dari sebuah file, maka akan mengeluarkan berbagai panggilan sistem perpustakaan yang akhirnya berakhir di kernel dalam bentuk open()
, read()
, close()
urutan (mungkin dengan seek()
dilemparkan untuk mengukur baik). Kernel mengambil path dan nama file yang disediakan, dan melalui sistem file dan perangkat I / O layer menerjemahkannya ke permintaan baca fisik (dan dalam banyak kasus juga menulis permintaan - pikirkan misalnya pembaruan atime) ke beberapa penyimpanan yang mendasarinya.
Namun, itu tidak harus menerjemahkan permintaan tersebut secara khusus ke penyimpanan fisik yang persisten . Kontrak kernel adalah bahwa mengeluarkan seperangkat panggilan sistem tertentu akan menyediakan konten file yang dimaksud . Di mana tepatnya di ranah fisik kita "file" ada adalah sekunder untuk ini.
Aktif /proc
biasanya dipasang apa yang dikenal sebagai procfs
. Itu adalah jenis sistem file khusus, tetapi karena ini adalah sistem file, itu benar-benar tidak berbeda dari misalnya ext3
sistem file yang dipasang di suatu tempat. Jadi permintaan diteruskan ke kode driver sistem file procfs, yang mengetahui semua file dan direktori ini dan mengembalikan potongan informasi tertentu dari struktur data kernel .
"Lapisan penyimpanan" dalam hal ini adalah struktur data kernel, dan procfs
menyediakan antarmuka yang bersih dan nyaman untuk mengaksesnya. Perlu diingat bahwa pemasangan proc di /proc
hanyalah konvensi; Anda bisa dengan mudah memasangnya di tempat lain. Bahkan, itu kadang-kadang dilakukan, misalnya di chroot jail ketika proses yang berjalan di sana membutuhkan akses ke / proc untuk beberapa alasan.
Ini bekerja dengan cara yang sama jika Anda menulis nilai ke beberapa file; di tingkat kernel, yang diterjemahkan menjadi serangkaian open()
, seek()
, write()
, close()
panggilan yang lagi bisa diteruskan ke driver sistem file; sekali lagi, dalam kasus khusus ini, kode procfs.
Alasan khusus mengapa Anda melihat file
kembali empty
adalah bahwa banyak file yang terpapar oleh procfs terpapar dengan ukuran 0 byte. Ukuran 0 byte kemungkinan merupakan optimasi pada sisi kernel (banyak file di / proc bersifat dinamis dan dapat dengan mudah bervariasi panjangnya, mungkin bahkan dari satu baca ke yang berikutnya, dan menghitung panjang setiap file pada setiap direktori yang dibaca akan berpotensi menjadi sangat mahal). Pergi dengan komentar untuk jawaban ini, yang dapat Anda verifikasi pada sistem Anda sendiri dengan menjalankan melalui strace atau alat serupa, file
pertama-tama mengeluarkan stat()
panggilan untuk mendeteksi file khusus, dan kemudian mengambil kesempatan untuk, jika ukuran file dilaporkan sebagai 0 , batalkan, dan laporkan file tersebut sebagai kosong.
Perilaku ini sebenarnya didokumentasikan dan dapat diganti dengan menentukan -s
atau --special-files
pada file
pemanggilan, meskipun sebagaimana dinyatakan dalam halaman buku panduan yang mungkin memiliki efek samping. Kutipan di bawah ini berasal dari halaman manual file BSD 5.11, tertanggal 17 Oktober 2011.
Biasanya, file hanya mencoba untuk membaca dan menentukan jenis file argumen yang laporan stat (2) adalah file biasa. Ini mencegah masalah, karena membaca file khusus mungkin memiliki konsekuensi aneh. Menentukan -s
opsi menyebabkan file juga membaca file argumen yang merupakan file khusus blok atau karakter. Ini berguna untuk menentukan tipe sistem file dari data di partisi disk mentah, yang memblokir file-file khusus. Opsi ini juga menyebabkan file mengabaikan ukuran file seperti yang dilaporkan oleh stat (2) karena pada beberapa sistem ia melaporkan ukuran nol untuk partisi disk mentah.
strace file /proc/version
ataultrace -S /proc/version
, pengoptimalannya agak kecil. Itu melakukanstat()
panggilan pertama dan menemukan bahwa ukurannya adalah 0, sehingga melewatkanopen()
- tetapi sebelum itu memuat beberapa file ajaib.