Saya mencari untuk menemukan perbedaan antara keempat ini di Google dan saya berharap akan ada sejumlah besar informasi tentang ini, tetapi benar-benar tidak ada perbandingan yang kuat antara keempat panggilan.
Saya mulai mencoba mengkompilasi tampilan dasar sekilas perbedaan antara panggilan sistem dan inilah yang saya dapatkan. Apakah semua informasi ini benar / apakah saya melewatkan sesuatu yang penting?
Fork
: Panggilan garpu pada dasarnya membuat duplikat dari proses saat ini, identik dalam hampir setiap cara (tidak semuanya disalin, misalnya, batas sumber daya dalam beberapa implementasi tetapi idenya adalah untuk membuat salinan sedekat mungkin).
Proses baru (anak) mendapatkan ID proses (PID) yang berbeda dan memiliki PID dari proses lama (induk) sebagai induk PID (PPID). Karena kedua proses sekarang menjalankan kode yang persis sama, mereka dapat mengetahui yang mana dengan kode pengembalian garpu - anak mendapat 0, orang tua mendapat PID anak. Ini semua, tentu saja, dengan asumsi panggilan garpu berfungsi - jika tidak, tidak ada anak yang dibuat dan orang tua mendapat kode kesalahan.
Vfork
: Perbedaan mendasar antara vfork dan fork adalah ketika proses baru dibuat dengan vfork (), proses induk ditangguhkan sementara, dan proses anak mungkin meminjam ruang alamat orangtua. Keadaan aneh ini berlanjut hingga proses anak keluar, atau panggilan execve (), di mana proses induk berlanjut.
Ini berarti bahwa proses turunan vfork () harus berhati-hati untuk menghindari variabel tak terduga memodifikasi proses induk. Secara khusus, proses anak tidak boleh kembali dari fungsi yang berisi panggilan vfork (), dan itu tidak boleh memanggil keluar () (jika perlu keluar, harus menggunakan _exit (); sebenarnya, ini juga berlaku untuk anak dari garpu normal ()).
Exec :
Panggilan exec adalah cara untuk mengganti seluruh proses saat ini dengan program baru. Itu memuat program ke dalam ruang proses saat ini dan menjalankannya dari titik masuk. exec () menggantikan proses saat ini dengan executable yang ditunjuk oleh fungsi. Kontrol tidak pernah kembali ke program semula kecuali ada kesalahan exec ().
Clone :
Clone, seperti garpu, menciptakan proses baru. Tidak seperti garpu, panggilan ini memungkinkan proses anak untuk berbagi bagian dari konteks eksekusi dengan proses panggilan, seperti ruang memori, tabel deskriptor file, dan tabel penangan sinyal.
Ketika proses anak dibuat dengan klon, ia mengeksekusi aplikasi fungsi fn (arg). (Ini berbeda dari garpu, di mana eksekusi berlanjut pada anak dari titik panggilan garpu asli.) Argumen fn adalah penunjuk ke fungsi yang dipanggil oleh proses anak pada awal pelaksanaannya. Argumen argumen diteruskan ke fungsi fn.
Ketika aplikasi fungsi fn (arg) kembali, proses anak berakhir. Integer yang dikembalikan oleh fn adalah kode keluar untuk proses anak. Proses anak juga dapat berakhir secara eksplisit dengan memanggil keluar (2) atau setelah menerima sinyal fatal.
Informasi yang diperoleh:
- Perbedaan antara garpu dan exec
- http://www.allinterview.com/showanswers/59616.html
- http://www.unixguide.net/unix/programming/1.1.2.shtml
- http://linux.about.com/library/cmd/blcmdl2_clone.htm
Terima kasih telah meluangkan waktu untuk membaca ini! :)
fork()
, yang ada di Linux, dan mungkin semua BSD) meminjam ruang alamat orang tuanya. Apa pun yang dilakukannya, selain menelepon execve()
atau _exit()
, memiliki potensi besar untuk mengacaukan orangtua. Secara khusus, exit()
panggilan atexit()
penangan dan "finalizer" lainnya, misalnya: ia menyiram aliran stdio. Kembali dari seorang vfork()
anak akan berpotensi (peringatan yang sama seperti sebelumnya) mengacaukan tumpukan orangtua.
fork
syscall?