(Hmm: berikut ini sekarang sedikit epik ...)
Desain direktori pada sistem file unix (yang, untuk menjadi bertele-tele, biasanya tetapi tidak harus terpasang pada OS unix) mewakili wawasan yang luar biasa, yang sebenarnya mengurangi jumlah kasus khusus yang diperlukan.
'Direktori' sebenarnya hanyalah sebuah file di sistem file. Semua konten aktual file dalam sistem file ada dalam inode (dari pertanyaan Anda, saya dapat melihat bahwa Anda sudah mengetahui beberapa hal ini). Tidak ada struktur ke inode pada disk - mereka hanya sekelompok besar byte byte, menyebar seperti selai kacang di atas disk. Ini tidak berguna, dan memang penolak bagi siapa pun dengan sedikit pun pikiran yang rapi.
Satu- satunya inode khusus adalah inode nomor 2 (bukan 0 atau 1, karena alasan Tradisi); inode 2 adalah file direktori: direktori root . Ketika sistem me-mount sistem file, ia 'tahu' ia harus membaca ind 2, untuk memulai sendiri.
File direktori hanyalah file, dengan struktur internal yang dimaksudkan untuk dibaca oleh opendir (3) dan teman-teman. Anda dapat melihat struktur internalnya didokumentasikan dalam dir (5) (tergantung pada OS Anda); jika Anda melihatnya, Anda akan melihat bahwa entri file direktori hampir tidak berisi informasi tentang file - itu semua ada di inode file. Salah satu dari beberapa hal yang istimewa tentang file ini adalah bahwa fungsi open (2) akan memberikan kesalahan jika Anda mencoba untuk membuka file direktori dengan mode yang memungkinkan penulisan. Berbagai perintah lain (untuk mengambil hanya satu contoh, hexdump
) akan menolak untuk bertindak secara normal dengan file direktori, hanya karena itu mungkin bukan apa yang ingin Anda lakukan (tapi itu kasus khusus mereka, bukan sistem file).
Sebuah hard link tidak lebih dan tidak kurang dari entri dalam peta file direktori. Anda dapat memiliki dua (atau lebih) entri dalam peta seperti itu yang keduanya memetakan ke nomor inode yang sama: karena itu inode memiliki dua (atau lebih) tautan keras. Ini juga menjelaskan mengapa setiap file memiliki setidaknya satu 'tautan keras'. Inode memiliki jumlah referensi, yang mencatat berapa kali inode disebutkan dalam file direktori di suatu tempat di filesystem (ini adalah nomor yang Anda lihat ketika Anda melakukannya ls -l
).
OK: kita langsung ke pokok permasalahan sekarang.
File direktori adalah peta string ('nama file') ke angka (nomor inode). Nomor-nomor inode itu adalah nomor-nomor inode dari file-file yang 'berada' dalam direktori itu. File-file yang 'di' direktori itu mungkin termasuk file direktori lain, sehingga nomor inode mereka akan berada di antara yang tercantum dalam direktori. Jadi, jika Anda memiliki file /tmp/foo/bar
, maka file direktori foo
menyertakan entri untuk bar
, memetakan string itu ke inode untuk file itu. Ada juga entri di file direktori /tmp
, untuk file direktori foo
yang 'di' direktori /tmp
.
Ketika Anda membuat direktori dengan mkdir (2), fungsi itu
- membuat file direktori (dengan beberapa nomor inode) dengan struktur internal yang benar,
- menambahkan entri ke direktori induk, memetakan nama direktori baru ke inode baru ini (yang menyumbang salah satu tautan),
- menambahkan entri ke direktori baru, memetakan string '.' ke inode yang sama (akun ini untuk tautan lain), dan
- menambahkan entri lain ke direktori baru, memetakan string '..' ke inode dari file direktori yang dimodifikasi pada langkah (2) (ini menyumbang lebih banyak tautan keras yang akan Anda lihat di file direktori yang berisi subdirektori ).
Hasil akhirnya adalah (hampir) satu-satunya kasus khusus adalah:
- Fungsi terbuka (2) mencoba membuatnya lebih sulit untuk menembak diri sendiri, dengan mencegah Anda membuka file direktori untuk ditulis.
- Fungsi mkdir (2) membuat semuanya menjadi menyenangkan dan mudah dengan menambahkan beberapa entri tambahan ('.' Dan '..') ke file direktori baru, murni untuk membuatnya nyaman untuk bergerak di sekitar sistem file. Saya menduga bahwa sistem file akan bekerja dengan baik tanpa '.' dan '..', tetapi akan sulit digunakan.
- File direktori adalah salah satu dari beberapa jenis file yang ditandai sebagai 'spesial' - ini benar-benar memberi tahu hal-hal seperti open (2) untuk berperilaku sedikit berbeda. Lihat
st_mode
pada stat (2).
(disalin dari pertanyaan asli stackoverflow, 2011-10-20)
..
hardlinks, perangkat lunak tree walk Anda sudah perlu memiliki pengecualian "jangan ikuti siklus pada tautan direktori induk" , jadi ini sedikit menambah kerumitan selain.
tautan.