Bagaimana bisa fd yang sama dalam proses yang berbeda menunjuk ke file yang sama?

25

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:

masukkan deskripsi gambar di sini

Bagaimana mungkin? Bukankah deskriptor file seharusnya indeks ke catatan di Tabel File Terbuka?

Pithikos
sumber
1
Pertanyaan bagus! Dugaan saya adalah bahwa file deskriptor diterjemahkan, sehingga fd 4dalam kedua proses relatif terhadap jumlah sendiri dari open fd's. Fd 0-2(stdin, stdout, sdterr) selalu dibuka untuk proses baru dan angka-angka tidak dicadangkan hanya untuk proses itu.
@ jw013 Saya pikir ini terdengar familier. \ @Pithikos Bagaimana ini bukan duplikat?
Michael Mrozek
1
Ini adalah diagram yang buruk - ini akan menunjukkan bahwa file deskriptor 4 berarti entri keempat [well, kelima, ini dihitung dari nol] dari tabel deskriptor file di sebelah kiri, bukan entri yang berisi "4". "4" yang sebenarnya tinggal di variabel userspace Anda yang berisi angka. Diagram dalam pertanyaan lain jauh lebih baik.
Acak 832
2
@ Random832 Nah jika saya tahu diagram mana yang benar maka saya mungkin tidak akan pernah membuat pertanyaan ini.
Pithikos

Jawaban:

35

Deskriptor file, yaitu 4dalam 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.

jw013
sumber
2
Sebagai catatan, hanya ada satu "file deskriptor flag" pada kebanyakan sistem, flag close-on-exec. Semua status "per-fd" lainnya (termasuk offset dan mode akses) adalah bagian dari entri tabel file terbuka.
Acak 832
24

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 Linuxstruct 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 ke lseekdua posisi berbeda dalam file yang sama, dan demikian juga akan digunakan dupuntuk mendapatkan dua pegangan ke file itu.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
2
Ini tidak sepenuhnya benar. Menurut halaman manual / spesifikasi, dupmelakukan 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 perlu openfile dua kali.
jw013
@Gilles "File deskriptor 4 dalam proses 1234 poin di dalam tabel proses 1234". Maksud Anda meja yang mana? Dari apa yang saya tahu satu-satunya tabel dalam proses adalah File Descriptor Table di mana setiap record menunjuk ke satu- satunya Open File Table kernel .
Pithikos
Lihat unix.stackexchange.com/questions/195057/… untuk deskripsi yang lebih tepat.
Gilles 'SANGAT berhenti menjadi jahat'
8

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.

Michał Šrajer
sumber
Tabel mana yang Anda maksud?
Pithikos
1
file deskriptor table
Michał Šrajer
7

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".

Bruce Ediger
sumber
2
The Sumber orangtua yang bijaksana kemungkinan David Wheeler. Tampaknya dia juga berkata, " Tapi itu biasanya akan menciptakan masalah lain. " :)
jw013