Saya membaca tutorial Unix ini dan menemukan kutipan ini ...
Kita harus mencatat di sini bahwa direktori hanyalah jenis file khusus.
... tapi tidak ada penjelasan atau detail yang diberikan. Bagaimana direktori sebenarnya hanya sebuah file?
Saya membaca tutorial Unix ini dan menemukan kutipan ini ...
Kita harus mencatat di sini bahwa direktori hanyalah jenis file khusus.
... tapi tidak ada penjelasan atau detail yang diberikan. Bagaimana direktori sebenarnya hanya sebuah file?
Jawaban:
Banyak entitas dengan gaya operasi * nix (dan lainnya) dianggap file, atau memiliki aspek seperti file, meskipun mereka tidak selalu merupakan urutan byte yang disimpan dalam sistem file. Tepatnya bagaimana direktori diimplementasikan tergantung pada jenis sistem file, tetapi umumnya apa yang dikandungnya, dianggap sebagai daftar, adalah urutan byte yang disimpan, jadi dalam hal itu mereka tidak terlalu istimewa.
Salah satu cara untuk mendefinisikan apa "file" dalam konteks * nix adalah bahwa itu adalah sesuatu yang memiliki deskriptor file yang terkait dengannya. Sesuai artikel wikipedia, deskriptor file
Dengan kata lain, mereka merujuk ke berbagai jenis sumber daya dari / di mana urutan byte dapat dibaca / ditulis, meskipun sumber / tujuan urutan itu tidak ditentukan. Dengan kata lain, "di mana" sumber daya itu bisa apa saja. Apa yang mendefinisikannya adalah bahwa itu adalah saluran informasi. Ini adalah bagian dari mengapa kadang-kadang dikatakan bahwa di unix "semuanya adalah file". Anda tidak boleh mengambilnya sepenuhnya secara harfiah, tetapi itu patut dipertimbangkan secara serius. Dalam kasus direktori, informasi ini berkaitan dengan apa yang ada di direktori, dan pada level implementasi yang lebih rendah, bagaimana menemukannya di dalam sistem file.
Direktori dalam hal ini agak spesial karena dalam kode C asli mereka tidak berhubungan dengan deskriptor file; API POSIX menggunakan tipe khusus stream handle
DIR*
,. Namun, tipe ini sebenarnya memiliki deskriptor dasar yang dapat diambil . Deskriptor dikelola oleh kernel dan mengaksesnya selalu melibatkan pemanggilan sistem, karenanya, aspek lain dari apa itu deskriptor adalah bahwa itu adalah saluran yang dikendalikan oleh kernel OS. Mereka memiliki angka unik (per proses) yang dimulai dengan 0, yang biasanya merupakan deskriptor untuk aliran input standar .sumber
openat
,fstatat
, dll) yang menggunakan file deskriptor mengacu pada direktori.fsync()
membaca saja (!) Direktori fd, dan ia memiliki efek yang terdefinisi dengan baik (khususnya, menyinkronkan pembuatan / penggantian nama file dalam direktori yang diberikan ke disk, langkah yang secara teoritis diperlukan dalam "tulis ke file sementara dan ganti nama menjadi "idiom" asli.Dalam Unix Way of Doing Things: semuanya adalah file.
Direktori adalah satu (dari banyak) jenis file khusus. Itu tidak mengandung data. Sebagai gantinya, ini berisi pointer ke semua file yang terkandung dalam direktori.
Jenis file khusus lainnya:
Tetapi karena mereka dianggap "file", Anda dapat
ls
membuatnya dan mengganti namanya dan memindahkannya dan, tergantung pada jenis file khusus, mengirim data ke / dari mereka.sumber
Jawaban saya hanyalah kenangan, tetapi dalam Unix vintage yang 199x, di mana ada banyak, direktori adalah file, hanya ditandai "direktori" di suatu tempat di in-disk inode.
Anda bisa membuka direktori dengan sesuatu seperti
open(".", O_RDONLY)
dan mendapatkan kembali deskriptor file yang dapat digunakan. Anda dapat mem-parsing konten jika Anda menjelajahi/usr/include
dan menemukan definisi C struct yang benar. Saya tahu bahwa saya melakukan ini untuk sistem SunOS 4.1.x, sistem berkas EFS SGI, dan workstation Mips-CPU DEC apa pun yang dimiliki untuk sistem berkas, mungkin BSD4.2 FFS.Itu adalah pengalaman buruk. Standarisasi pada lapisan sistem file virtual adalah hal yang baik untuk portabilitas, bahkan jika direktori tidak lagi menjadi file yang ketat. Lapisan VFS mari kita bereksperimen dengan sistem file di mana direktori bukan file, seperti ReiserFS, atau NFS.
sumber
cp --link dir1/* dir2
, meskipun saya tidak yakin tentang kegunaannya.Direktori adalah spesial karena memiliki 'd' dalam modenya, memberi tahu sistem file bahwa ia harus menafsirkan isinya sebagai daftar file lain yang terdapat dalam direktori, bukan file biasa yang hanya merupakan urutan byte yang akan dibuat. dibaca oleh aplikasi. Itu semuanya.
sumber
Direktori adalah file karena sistem linux menggunakan model i / o universal . Dalam model, semua yang ada di sistem adalah file dan dapat diakses dengan panggilan sistem yang sama dan berbagai perintah.
Mereka adalah tipe khusus karena i-node mereka memiliki tanda untuk tipe file dan mereka memiliki struktur khusus menjadi tabel nama file dan tautan ke i-node lainnya. Pasangan filename-link ini, juga dikenal sebagai "hardlink", dalam i-simpul direktori menyebutkan file "di dalam" direktori.
Direktori hanya untuk mengatur file. Ketika sebuah file "dipindahkan" dari direktori ke yang lain, file itu sendiri tidak pindah ke disk. Hanya saja entri dalam satu direktori i-node dihapus dan ditulis dalam direktori lain i-node.
sumber
Jawaban yang diterima tidak sepenuhnya benar. dalam sistem POSIX, "Inodes" menunjuk ke file dan direktori. File Deskriptor hanya unik untuk suatu proses, dan tidak lintas sistem. Namun inode unik, meskipun lebih dari satu inode dapat mengarah ke satu file. Akan mengomentari jawaban yang diterima tetapi tidak bisa karena pembatasan rep.
sumber
ls -l >test.txt;ln -vf test.txt test2.txt;ls -li test.txt test2.txt
. Jadi Anda akan lihat, bahwa tautan keras memiliki nomor inode yang sama.fork()
s, proses anaknya akan memiliki (kecuali beberapa keadaan khusus, yaituO_CLOEXEC
bendera) persis entitas pengarsipan yang sama dengan proses aslinya. Contoh lain: proses apache child sedanglisten()
pada deskriptor file socket yang sama. Tetapi jawaban ini bukan tentang deskriptor file, yang merupakan struktur data kernel-internal dan hanya ada di memori kernel. Jawaban ( salah ) ini adalah tentang entri direktori dan inode, ini adalah entitas di-disk (yaitu mereka adalah byte fisik pada hard drive).fork()
terjadi dan kemudian proses anakseek()
s atauclose()
s, itu tidak akan mempengaruhi file descriptor dari orangtua. Jadi saya berpikir sekarang, bahwa file deskriptor hanya sebagian struktur proses-pribadi. Tetapi pertanyaan ini bukan tentang mereka, pertanyaan ini adalah tentang dirents / inode dan saya mengomentari Anda pada jawaban yang sepenuhnya salah untuk pertanyaan ini.