Mengapa open()
dan close()
ada dalam desain sistem file Unix?
Tidak bisakah OS hanya mendeteksi pertama kali read()
atau write()
dipanggil dan melakukan apa pun yang open()
biasanya akan dilakukan?
files
filesystems
architecture
api
pengguna5977637
sumber
sumber
open()
ada. "Tidak bisakah OS hanya mendeteksi saat pertama kali membaca () atau menulis () dan melakukan apa pun yang terbuka () biasanya lakukan?" Apakah ada saran yang sesuai untuk kapan penutupan akan terjadi?read()
atauwrite()
file mana yang akan diakses? Agaknya dengan melewati jalan setapak. Bagaimana jika jalur file berubah saat Anda mengaksesnya (antara duaread()
atauwrite()
panggilan)?read()
danwrite()
, hanya padaopen()
.Jawaban:
Dennis Ritchie menyebutkan dalam «Evolusi Sistem Berbagi Waktu Unix» itu
open
danclose
bersama dengan ituread
,write
dancreat
hadir dalam sistem sejak awal.Saya kira sistem tanpa
open
danclose
tidak akan terbayangkan, namun saya percaya itu akan menyulitkan desain. Anda biasanya ingin membuat beberapa panggilan baca dan tulis, bukan hanya satu, dan itu mungkin terutama benar pada komputer-komputer lama dengan RAM yang sangat terbatas yang berasal dari UNIX. Memiliki pegangan yang mempertahankan posisi file Anda saat ini menyederhanakan ini. Jikaread
atauwrite
adalah untuk mengembalikan pegangan, mereka harus mengembalikan sepasang - pegangan dan status pengembalian mereka sendiri. Bagian pegangan dari pasangan tidak akan berguna untuk semua panggilan lain, yang akan membuat pengaturan itu canggung. Membiarkan status kursor ke kernel memungkinkannya untuk meningkatkan efisiensi tidak hanya dengan buffering. Ada juga beberapa biaya yang terkait dengan pencarian jalur - memiliki pegangan memungkinkan Anda membayarnya sekali saja. Selain itu, beberapa file dalam pandangan dunia UNIX bahkan tidak memiliki jalur sistem file (atau tidak - sekarang mereka lakukan dengan hal-hal seperti/proc/self/fd
).sumber
open
/close
, Anda pasti akan menerapkan hal-hal seperti/dev/stdout
mengizinkan perpipaan.open()
menjadiget_inode()
dan membuat keseluruhan sistem lebih kaku (tidak mungkin membaca / menulis file yang sama di beberapa posisi secara bersamaan).Maka semua panggilan
read
danwrite
harus melewati informasi ini pada setiap operasi:Apakah Anda mempertimbangkan independen panggilan
open
,read
,write
danclose
menjadi lebih sederhana daripada tujuan tunggal I / O pesan didasarkan pada filosofi desain Anda. Pengembang Unix memilih untuk menggunakan operasi dan program sederhana yang dapat digabungkan dalam banyak cara, daripada operasi tunggal (atau program) yang melakukan segalanya.sumber
read
danwrite
tidak terbatas pada file yang hidup pada sistem file, dan itu adalah keputusan desain mendasar di Unix, seperti dijelaskan pjc50.lseek
)Konsep pegangan file penting karena pilihan desain UNIX bahwa "semuanya adalah file", termasuk hal-hal yang bukan bagian dari sistem file. Seperti tape drive, keyboard dan layar (atau teletype!), Pembaca kartu / tape, koneksi serial, koneksi jaringan, dan (penemuan UNIX kunci) koneksi langsung ke program lain yang disebut "pipa".
Jika Anda melihat banyak utilitas standar UNIX sederhana seperti
grep
, terutama dalam versi aslinya, Anda akan melihat bahwa mereka tidak memasukkan panggilan keopen()
danclose()
tetapi hanyaread
danwrite
. Pegangan file diatur di luar program oleh shell dan diteruskan ketika dimulai. Jadi program tidak perlu peduli apakah itu menulis ke file atau ke program lain.Serta
open
, cara lain untuk mendapatkan deskriptor file yangsocket
,listen
,pipe
,dup
, dan sangat mekanisme Heath Robinson untuk mengirimkan file deskriptor lebih pipa: https://stackoverflow.com/questions/28003921/sending-file-descriptor-by-linux -stopkontakSunting: beberapa catatan kuliah yang menjelaskan lapisan tipuan dan bagaimana ini memungkinkan O_APPEND bekerja dengan masuk akal. Perhatikan bahwa menyimpan data inode dalam memori menjamin sistem tidak perlu pergi dan mengambilnya lagi untuk operasi penulisan berikutnya.
sumber
creat
, danlisten
tidak membuat fd, tetapi ketika (dan jika) permintaan masuk saat mendengarkanaccept
membuat dan mengembalikan fd untuk soket (terhubung) yang baru.pipe
diperkenalkan beberapa tahun setelah pengembangan di Unix dimulai.Jawabannya adalah tidak, karena buka () dan tutup () buat dan hancurkan pegangan masing-masing. Ada waktu (yah, sepanjang waktu, sungguh) di mana Anda mungkin ingin menjamin bahwa Anda adalah satu-satunya penelepon dengan tingkat akses tertentu, karena penelepon lain (misalnya) menulis ke file yang Anda parsing secara tidak terduga dapat meninggalkan aplikasi dalam keadaan yang tidak diketahui atau mengarah ke livelock atau jalan buntu, misalnya lemma Filsuf Makan.
Bahkan tanpa pertimbangan itu, ada implikasi kinerja yang harus dipertimbangkan; close () memungkinkan sistem file untuk (jika sesuai atau jika Anda memanggilnya) membilas buffer yang Anda tempati, sebuah operasi yang mahal. Beberapa pengeditan berurutan ke aliran dalam memori jauh lebih efisien daripada beberapa siklus baca-tulis-ubah yang pada dasarnya tidak terkait dengan sistem file yang, sepengetahuan Anda, ada setengah dunia yang tersebar di pusat data dengan penyimpanan massal laten tinggi. Bahkan dengan penyimpanan lokal, memori biasanya banyak urutan besarnya lebih cepat daripada penyimpanan massal.
sumber
Open () menawarkan cara untuk mengunci file saat sedang digunakan. Jika file dibuka secara otomatis, baca / tulis dan kemudian ditutup lagi oleh OS tidak akan ada yang menghentikan aplikasi lain mengubah file-file tersebut di antara operasi.
Meskipun ini dapat dikelola (banyak sistem mendukung akses file non-eksklusif) untuk kesederhanaan sebagian besar aplikasi menganggap bahwa file yang mereka buka tidak berubah.
sumber
Karena jalur file mungkin bergerak sementara Anda menganggap itu akan tetap sama.
sumber
Membaca dan menulis ke sistem file mungkin melibatkan berbagai skema penyangga, pemeliharaan sistem operasi, manajemen disk tingkat rendah, dan sejumlah tindakan potensial lainnya. Jadi tindakan
open()
danclose()
berfungsi sebagai set-up untuk jenis kegiatan di bawah tenda. Implementasi yang berbeda dari sistem file dapat sangat disesuaikan sesuai kebutuhan dan tetap transparan untuk program pemanggilan.Jika OS tidak memiliki buka / tutup, maka dengan
read
atauwrite
, tindakan file tersebut masih harus melakukan inisialisasi, pembilasan buffer / manajemen, dll setiap waktu. Itu banyak overhead untuk memaksakan membaca dan menulis berulang.sumber
Mantra Unix adalah "menawarkan satu cara melakukan sesuatu", yang berarti "memfaktorkan" ke dalam bagian-bagian (dapat digunakan kembali) untuk digabungkan sesuka hati. Yaitu, dalam hal ini pisahkan pembuatan dan penghancuran file menangani dari penggunaannya. Manfaat penting datang kemudian, dengan koneksi pipa dan jaringan (mereka juga dimanipulasi melalui pegangan file, tetapi mereka diciptakan dengan cara lain). Mampu mengirim file menangani sekitar (misalnya menyerahkannya ke proses anak sebagai "file terbuka" yang bertahan
exec(2)
, dan bahkan untuk proses yang tidak terkait melalui pipa) hanya mungkin dengan cara ini. Terutama jika Anda ingin menawarkan akses terkontrol ke file yang dilindungi. Jadi Anda bisa misalnya membuka/etc/passwd
untuk menulis, dan meneruskannya ke proses anak yang tidak diizinkan untuk membuka file itu untuk ditulis (ya, saya tahu ini adalah contoh yang konyol, silakan mengedit dengan sesuatu yang lebih realistis).sumber