Bagaimana direktori merupakan "jenis file khusus"?

Jawaban:

19

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

adalah indikator abstrak yang digunakan untuk mengakses file atau sumber input / output lainnya , seperti pipa atau koneksi jaringan ...

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 .

goldilocks
sumber
2
POSIX.1-2008 menambahkan sekelompok panggilan sistem ( openat, fstatat, dll) yang menggunakan file deskriptor mengacu pada direktori.
zwol
2
Yang lebih menarik lagi, Anda dapat 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.
Kevin
13

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:

  • tautan
  • soket
  • perangkat

Tetapi karena mereka dianggap "file", Anda dapat lsmembuatnya dan mengganti namanya dan memindahkannya dan, tergantung pada jenis file khusus, mengirim data ke / dari mereka.

nyanyian pujian
sumber
1
Dan ini membuat hidup lebih mudah, karena Anda tidak perlu melakukan sesuatu yang berbeda hanya karena itu adalah direktori. Ini berlaku untuk program penulisan serta operasi dari baris perintah (atau GUI).
Gbarry
1
Direktori tidak berisi data: data yang menjelaskan file yang terkandung dalam direktori. Sangat mungkin untuk mengakses direktori (walaupun mungkin tidak dengan panggilan terbuka standar) dan membaca data itu sendiri, meskipun (seperti yang dicatat Bruce Ediger dalam jawabannya) data tidak banyak digunakan kecuali Anda tahu formatnya.
jamesqf
11

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/includedan 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.

Bruce Ediger
sumber
1
Anda masih dapat membuka direktori dan membacanya sebagai file pada beberapa varian Unix hari ini, misalnya masih dimungkinkan pada FreeBSD 10.1. (Bisakah ≠ harus)
Gilles 'SO- berhenti menjadi jahat'
@Gilles Saya pikir akan sangat logis jika direktori yang disalin oleh dd pada dasarnya setara cp --link dir1/* dir2, meskipun saya tidak yakin tentang kegunaannya.
peterh mengatakan mengembalikan Monica
3

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.

psusi
sumber
Hal-hal yang tidak begitu sederhana dengan semua filesystem - misalnya, dalam HFS + Apple hanya ada satu pohon B + besar yang berisi semua nama path, jika saya ingat dengan benar - tetapi pengamatan ini tepat untuk filesystem Unix hingga dan termasuk BSD's ffs, yang mungkin apa yang dipikirkan oleh penulis dari tutorial yang dikutip.
zwol
2

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.

Henri Kynsilehto
sumber
-3

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.

Rick
sumber
2
Tidak, hanya 1 inode yang dapat menunjuk ke file yang sama. Meskipun inode yang sama dapat ada secara simultan di banyak direktori (atau beberapa nama). Pemeriksaan yang mudah: 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.
peterh mengatakan mengembalikan Monica
@peterh File deskriptor hanya unik untuk suatu proses. dapatkah kamu menjelaskan
alamin
1
@ Md.AlaminMahamud Tidak benar, jika suatu proses fork()s, proses anaknya akan memiliki (kecuali beberapa keadaan khusus, yaitu O_CLOEXECbendera) persis entitas pengarsipan yang sama dengan proses aslinya. Contoh lain: proses apache child sedang listen()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).
peterh mengatakan mengembalikan Monica
1
@ Md.AlaminMahamud Yah, sekarang saya tidak begitu yakin, misalnya jika fork()terjadi dan kemudian proses anak seek()s atau close()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.
peterh mengatakan mengembalikan Monica