Dari halaman manual dari vfork()
:
vfork () berbeda dari fork () karena orangtua ditangguhkan hingga anak melakukan panggilan untuk mengeksekusi (2) atau _exit (2). Anak berbagi semua memori dengan induknya, termasuk tumpukan, sampai execve () dikeluarkan oleh anak. Anak tidak boleh kembali dari fungsi saat ini atau panggilan keluar (), tetapi dapat memanggil _exit ().
Mengapa anak harus menggunakan _exit()
panggilan telepon daripada hanya menelepon exit()
? Saya harap ini berlaku untuk keduanya vfork()
dan fork()
.
c
system-calls
fork
exit
Sen
sumber
sumber
Jawaban:
Seperti yang terlihat sebelumnya ,
vfork
tidak memungkinkan proses anak untuk mengakses memori orang tua.exit
adalah fungsi pustaka C (itulah sebabnya sering ditulis sebagaiexit(3)
). Ia melakukan berbagai tugas pembersihan seperti pembilasan dan penutupan stream C (file yang dibuka melalui fungsi yang dinyatakan dalamstdio.h
) dan menjalankan fungsi yang ditentukan pengguna yang terdaftaratexit
. Semua tugas ini melibatkan membaca dan menulis ke memori proses._exit
keluar tanpa pembersihan. Ini secara langsung pemanggilan sistem (itulah sebabnya itu ditulis sebagai_exit(2)
), biasanya dilaksanakan dengan menempatkan nomor pemanggilan sistem dalam register prosesor dan menjalankan instruksi prosesor tertentu (bercabang ke pengendali panggilan sistem). Ini tidak perlu mengakses memori proses, jadi aman untuk dilakukan setelahnyavfork
.Setelah itu
fork
, tidak ada batasan seperti itu: proses orangtua dan anak sekarang sepenuhnya otonom.sumber
init
bercabang oleh kernel).exit
lakukan pembersihan tambahan seperti fungsi panggilan yang didaftarkan olehatexit
karena itu mengakses data di luar bagian yang disalin._exit
melakukan syscall secara langsung tanpa pembersihan apa pun kecuali dalam kernel.sumber
Anda memiliki panggilan anak _exit () untuk menghindari pembilasan stdio (atau lainnya) buffer ketika proses anak keluar. Karena proses anak merupakan salinan persis dari proses induk, proses anak masih memiliki apa pun yang dimiliki orang tua di "stdout" atau "stderr", buffer dari <stdio.h>. Anda dapat (dan akan, pada waktu yang tidak tepat) mendapatkan output ganda dengan memanggil exit (), satu dari child process 'atexit handler, dan satu dari parent, ketika buffer dalam proses parent menjadi penuh, dan mendapatkan flush.
Saya menyadari jawaban di atas berkonsentrasi pada stdio.h spesifik, tetapi gagasan itu mungkin mengarah ke I / O buffered lainnya, seperti yang ditunjukkan oleh salah satu jawaban di atas.
sumber
exit()
: - melakukan beberapa tugas pembersihan, seperti menutup aliran i / o dan banyak lagi, lalu kembali ke kernel._exit()
: - langsung datang ke kernel (tidak melakukan tugas pembersihan).fork()
: kedua orang tua dan anak memiliki tabel file yang berbeda, sehingga perubahan yang dilakukan oleh anak tidak mempengaruhi parameter lingkungan dari orang tua, dan sebaliknya.vfork()
: baik induk maupun anak menggunakan tabel file yang sama, sehingga perubahan yang dilakukan oleh anak mempengaruhi parameter lingkungan induk. misalnya beberapa variabelvar=10
, sekarang dijalankanvar++
oleh child dan kemudian jalankan parent, Anda dapat melihat efeknyavar++
pada output parent juga.Seperti yang saya katakan jika Anda menggunakan
exit()
dalamvfork()
maka semua i / o sudah ditutup. Jadi, bahkan jika orangtua berjalan dengan benar, Anda tidak bisa mendapatkan output yang tepat, karena semua variabel memerah dan semua aliran ditutup.sumber