Deskriptor file dan garpu

15

Ketika seorang anak bercabang maka itu mewarisi deskriptor file orang tua, jika anak menutup file deskriptor apa yang akan terjadi? Jika anak mulai menulis apa yang akan terjadi pada file di ujung orang tua? Siapa yang mengelola inkonsistensi, kernel, atau pengguna ini?

ketika suatu proses memanggil closefungsi untuk menutup file terbuka tertentu melalui deskriptor file. Dalam tabel file proses, jumlah referensi dikurangi oleh satu. Tetapi karena orang tua dan anak sama-sama memegang file yang sama, jumlah referensi adalah 2 dan setelah ditutup berkurang menjadi 1. Karena bukan nol proses masih terus menggunakan file tanpa masalah.

Lihat pemrograman sistem UNIX Terrence Chan, (Dukungan kernel Unix untuk File).

Madan Ram
sumber
Oke, jangan pikirkan komentar terakhir;) Di halaman manual untuk open()dan fork()ada perbedaan antara file descript-atau dan file descipt-ion - yang pertama merujuk ke yang terakhir, dan meskipun deskriptor dalam garpu adalah salinan, mereka merujuk pada deskripsi yang sama. Namun, ketika diuji jelas ini tidak berarti menutup pegangan anak menutup pegangan orang tua. Saya pikir itu mungkin membuat perbedaan yang halus untuk interleaving data ketika keduanya menangani menulis - tapi itu tidak pasti, jadi bagaimana tepatnya itu terjadi tidak begitu penting.
goldilocks

Jawaban:

28

Ketika seorang anak bercabang maka itu mewarisi deskriptor file orang tua, jika anak menutup file deskriptor apa yang akan terjadi?

Itu mewarisi salinan deskriptor file. Jadi menutup deskriptor pada anak akan menutupnya untuk anak, tetapi tidak untuk orang tua, dan sebaliknya.

Jika anak mulai menulis apa yang akan terjadi pada file di ujung orang tua? Siapa yang mengelola inkonsistensi, kernel, atau pengguna ini?

Ini persis (seperti dalam, secara harfiah persis) sama dengan dua proses menulis ke file yang sama. Kernel menjadwalkan proses secara mandiri, sehingga Anda mungkin akan mendapatkan data yang disisipkan dalam file.

Namun, POSIX (di mana sistem * nix sebagian besar atau sepenuhnya sesuai), menetapkan bahwa read()dan write()fungsi dari API C (yang memetakan ke panggilan sistem) adalah "atom terhadap satu sama lain [...] ketika mereka beroperasi pada file biasa atau tautan simbolik ". GNU C secara manual juga menjanjikan hal ini terkait dengan pipa (perhatikan standarnya PIPE_BUF, yang merupakan bagian dari ketentuan, adalah 64 kiB). Ini berarti bahwa panggilan dalam bahasa lain / alat, seperti penggunaan echoatau cat, harus dimasukkan dalam kontrak itu, jadi jika dua proses independen mencoba untuk menulis "halo" dan "dunia" secara bersamaan ke pipa yang sama, apa yang akan keluar yang lain akhir adalah "helloworld" atau "worldhello", dan tidak pernah seperti "

ketika suatu proses memanggil fungsi tutup untuk menutup file terbuka tertentu melalui deskriptor file. Tabel file proses mengurangi jumlah referensi oleh satu. Tapi karena orang tua dan anak keduanya memegang file yang sama (ada jumlah referensi adalah 2 dan setelah ditutup mengurangi ke 1) karena ini bukan nol sehingga proses masih terus menggunakan file tanpa masalah.

Ada DUA proses, orang tua dan anak. Tidak ada "jumlah referensi" yang sama untuk keduanya. Mereka mandiri. WRT apa yang terjadi ketika salah satu dari mereka menutup deskriptor file, lihat jawaban untuk pertanyaan pertama.

goldilocks
sumber
1

Setiap kali fork()membuat anak baru, deskriptor file tidak dipertahankan sama sekali - mereka diubah.

Meskipun file akan menjadi duplikat, itu akan memiliki deskriptor file yang berbeda.

mannukaushikece
sumber