Saya telah melihat banyak penjelasan mengapa penghitungan tautan untuk direktori kosong di OS berbasis Unix adalah 2 bukannya 1. Mereka semua mengatakan bahwa itu karena '.' direktori, yang setiap direktori tunjuk kembali ke dirinya sendiri. Saya mengerti mengapa memiliki konsep '.' berguna untuk menentukan jalur relatif, tetapi apa yang diperoleh dengan mengimplementasikannya di tingkat filesystem? Mengapa tidak hanya memiliki cangkang atau sistem panggilan yang mengambil jalur tahu bagaimana menafsirkannya?
Itu '..' adalah tautan nyata yang jauh lebih masuk akal bagi saya - sistem file perlu menyimpan pointer kembali ke direktori induk untuk menavigasi ke sana. Tetapi saya tidak mengerti mengapa '.' menjadi tautan yang nyata diperlukan. Tampaknya juga mengarah ke kasus khusus yang jelek dalam implementasi - Anda akan berpikir Anda hanya bisa membebaskan ruang yang digunakan oleh inode yang memiliki jumlah tautan kurang dari 1, tetapi jika mereka direktori, Anda benar-benar perlu memeriksa untuk a tautan dihitung kurang dari 2. Mengapa inkonsistensi?
sumber
..
hardlinks, perangkat lunak tree walk Anda sudah perlu memiliki pengecualian "jangan ikuti siklus pada tautan direktori induk" , jadi ini sedikit menambah kerumitan selain.
tautan.Jawaban:
Pertanyaan yang menarik. Sekilas saya melihat keuntungan-keuntungan berikut:
Pertama-tama Anda menyatakan bahwa menafsirkan "
.
" sebagai direktori saat ini dapat dilakukan oleh Shell atau dengan panggilan sistem. Tetapi memiliki entri-titik dalam direktori sebenarnya menghilangkan keharusan ini dan memaksa konsistensi bahkan pada tingkat yang lebih rendah.Tapi saya tidak berpikir bahwa ini adalah ide dasar di balik keputusan desain ini.
Ketika file sedang dibuat atau dihapus dari direktori, cap waktu modifikasi direktori harus diperbarui juga. Stempel waktu ini disimpan dalam inode-nya. Nomor inode disimpan dalam entri direktori yang sesuai.
JIKA entri titik tidak akan ada di sana, rutinitas harus mencari nomor inode pada entri untuk direktori ini di direktori induk, yang akan menyebabkan pencarian direktori lagi.
TAPI untungnya ada titik entri di direktori saat ini. Rutin yang menambah atau menghapus file di direktori saat ini hanya harus melompat kembali ke entri pertama (di mana entri-titik biasanya berada) dan segera telah menemukan nomor inode untuk direktori saat ini.
Ada hal baik ketiga tentang entri titik:
Ketika
fsck
memeriksa sistem file yang busuk dan harus berurusan dengan blok yang tidak terhubung yang juga tidak ada dalam daftar gratis, mudah untuk memverifikasi apakah blok data (ketika diartikan sebagai daftar direktori) memiliki entri titik yang menunjuk ke inode yang pada gilirannya menunjuk kembali ke blok data ini. Jika demikian, blok data ini dapat dianggap sebagai direktori yang hilang yang harus dihubungkan kembali.sumber
.
di direktori saat ini. Kecuali Anda dapat menemukan kernel yang berfungsi seperti ini (saya ragu ...)(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 direktorifoo
menyertakan entri untukbar
, memetakan string itu ke inode untuk file itu. Ada juga entri di file direktori/tmp
, untuk file direktorifoo
yang 'di' direktori/tmp
.Ketika Anda membuat direktori dengan mkdir (2), fungsi itu
Hasil akhirnya adalah (hampir) satu-satunya kasus khusus adalah:
st_mode
pada stat (2).(disalin dari pertanyaan asli stackoverflow, 2011-10-20)
sumber