Katakanlah saya memiliki proses 1 dan proses 2 . Keduanya memiliki file descriptor yang sesuai dengan integer 4.
Namun dalam setiap proses, deskriptor file 4 menunjuk ke file yang sama sekali berbeda dalam Tabel File Buka kernel:
Bagaimana mungkin? Bukankah deskriptor file seharusnya indeks ke catatan di Tabel File Terbuka?
kernel
open-files
file-descriptors
Pithikos
sumber
sumber
4
dalam kedua proses relatif terhadap jumlah sendiri dari open fd's. Fd0-2
(stdin, stdout, sdterr) selalu dibuka untuk proses baru dan angka-angka tidak dicadangkan hanya untuk proses itu.Jawaban:
Deskriptor file, yaitu
4
dalam contoh Anda, adalah indeks ke dalam tabel deskriptor file spesifik-proses , bukan tabel file terbuka. Entri deskriptor file itu sendiri berisi indeks ke entri dalam tabel file open global kernel, serta flag deskriptor file.sumber
Setiap proses memiliki tabel deskriptor file sendiri. File deskriptor 4 dalam proses 1234 poin di dalam tabel proses 1234. File deskriptor 4 dalam proses 5678 poin di dalam tabel proses 5678. Kasing yang harus Anda ketahui adalah deskriptor file 0, 1 dan 2 yang untuk setiap proses merupakan input standar, output standar, dan kesalahan standar, yang menunjukkan ke mana pun diarahkan.
Suatu proses dapat membuka file yang sama lebih dari sekali. Ini dapat terjadi secara kebetulan, misalnya ketika standar output suatu proses dan kesalahan standar dialihkan ke terminal yang sama atau ke file yang sama. Entri tabel file yang mendasarinya (misalnya Linux
struct file
) membawa lebih dari informasi tentang file; mereka juga berisi mode pembuka (mis. baca atau tulis) dan status lainnya (seperti flag, mis. close-on-exec). Sebagai contoh, suatu proses mungkin memiliki terminal dibuka untuk membaca hanya pada file descriptor 0 dan terminal yang sama dibuka hanya untuk menulis pada deskriptor file 2. Entri tabel file juga berisi posisi proses dalam file; suatu proses mungkin ingin kelseek
dua posisi berbeda dalam file yang sama, dan demikian juga akan digunakandup
untuk mendapatkan dua pegangan ke file itu.sumber
dup
melakukan apa yang dikatakannya pada kaleng: kedua deskriptor yang dihasilkan menunjuk ke entri tabel file yang sama dan dengan demikian berbagi offset yang sama. Untuk mendapatkan 2 entri tabel file yang berbeda, saya cukup yakin Anda perluopen
file dua kali.Setiap proses memiliki tabel deskriptor file sendiri. Itu saja.
Semuanya dijelaskan dengan sangat baik dalam Pemrograman Jaringan UNIX oleh Richard Stevens jika Anda ingin mempelajarinya secara mendalam.
sumber
Tidakkah tingkat tipuan ekstra memperbaiki masalah Anda? ("Semua masalah dalam pemrograman komputer dapat diselesaikan dengan tingkat tipuan ekstra" - beberapa greybeard yang bijaksana). Yaitu, integer kecil di setiap proses berakhir sebagai indeks ke dalam array proses per indeks kernel-ruang ke dalam "Open File Table".
sumber