Ini untuk menyederhanakan antarmuka. Alternatif untuk fork
dan exec
akan menjadi sesuatu seperti fungsi CreateProcess Windows . Perhatikan berapa banyak parameter yang CreateProcess
dimiliki, dan banyak dari mereka adalah struct dengan lebih banyak parameter. Ini karena semua yang Anda mungkin ingin kontrol tentang proses baru harus diteruskan CreateProcess
. Faktanya, CreateProcess
tidak memiliki parameter yang cukup, jadi Microsoft harus menambahkan CreateProcessAsUser dan CreateProcessWithLogonW .
Dengan fork/exec
model, Anda tidak perlu semua parameter itu. Alih-alih, atribut tertentu dari proses dipertahankan di seluruh exec
. Ini memungkinkan Anda untuk fork
, kemudian mengubah atribut proses apa pun yang Anda inginkan (menggunakan fungsi yang sama seperti yang biasa Anda gunakan), lalu exec
. Di Linux, fork
tidak memiliki parameter, dan execve
hanya memiliki 3: program untuk dijalankan, baris perintah untuk memberikannya, dan lingkungannya. (Ada exec
fungsi - fungsi lain , tetapi mereka hanya pembungkus yang execve
disediakan oleh perpustakaan C untuk menyederhanakan kasus penggunaan umum.)
Jika Anda ingin memulai proses dengan direktori saat ini berbeda: fork
, chdir
, exec
.
Jika Anda ingin mengarahkan ulang stdin / stdout:, fork
tutup / buka file exec
,.
Jika Anda ingin pengguna beralih: fork
, setuid
, exec
.
Semua hal ini dapat digabungkan sesuai kebutuhan. Jika seseorang menghasilkan atribut proses jenis baru, Anda tidak perlu mengubah fork
dan exec
.
Seperti yang disebutkan oleh larsks, sebagian besar Unix modern menggunakan copy-on-write, jadi fork
tidak melibatkan overhead yang signifikan.
fork(2)
halaman manual di Linux mengatakan:Under Linux, fork() is implemented using copy-on-write pages, so the only penalty that it incurs is the time and memory required to duplicate the parent's page tables, and to create a unique task structure for the child.
Saya membayangkan (tetapi tidak tahu pasti) bahwa ini adalah kasus untuk rasa Unix modern lainnya.