Saya belajar tentang perintah fork () dan exec (). Sepertinya fork () dan exec () biasanya dipanggil bersama. (fork () membuat proses anak baru, dan exec () menggantikan gambar proses saat ini dengan yang baru.) Namun, dalam skenario apa Anda dapat memanggil masing-masing fungsi sendiri? Apakah ada skenario seperti ini?
system-calls
exec
fork
quil
sumber
sumber
Jawaban:
Tentu! Pola umum dalam program "wrapper" adalah melakukan berbagai hal dan kemudian menggantinya dengan beberapa program lain hanya dengan
exec
panggilan (tanpa garpu)Contoh nyata dari ini adalah
GIT_SSH
(meskipungit(1)
juga menawarkanGIT_SSH_COMMAND
jika Anda tidak ingin melakukan metode program pembungkus di atas).Fork-only digunakan ketika memunculkan sekelompok proses yang biasanya dikerjakan oleh pekerja (mis. Apache
httpd
dalam mode fork (meskipun fork-only lebih baik untuk proses yang perlu membakar CPU dan bukan yang mengutak-atik ibu jari mereka menunggu jaringan I / O terjadi) ) atau untuk pemisahan hak istimewa yang digunakan olehsshd
dan program lain di OpenBSD (tidak ada eksekutif)The
root
sshd telah pada klien connect bercabang off salinan dirinya (28.571) dan kemudian salinan lain (14.625) untuk pemisahan hak istimewa.sumber
Ada banyak.
Program yang memanggil
fork()
tanpaexec()
biasanya mengikuti pola pemijahan anak pekerja proses untuk melakukan berbagai tugas dalam proses terpisah untuk yang utama. Anda akan menemukan ini di program beragam sepertidhclient
,php-fpm
, danurxvtd
.Suatu program yang memanggil
exec()
tanpafork()
adalah pemuatan berantai , melapisi prosesnya dengan gambar program yang berbeda. Ada seluruh subkultur utilitas pemuatan rantai yang melakukan hal-hal tertentu untuk memproses keadaan dan kemudian menjalankan program lain untuk dijalankan dengan keadaan proses yang direvisi. Utilitas seperti itu biasa terjadi pada keluarga daemontools dari layanan dan tool manajemen sistem, tetapi tidak terbatas pada itu saja. Beberapa contoh:chpst
dari runit Gerrit Papes6-softlimit
dans6-envdir
dari s6 Laurent Bercotlocal-reaper
danmove-to-control-group
dari nosh toolset sayardprio
danidprio
di FreeBSDnumactl
di FreeBSD dan LinuxToolsets daemontools keluarga memiliki banyak alat-alat tersebut, dari
machineenv
melaluifind-matching-jvm
keruntool
.sumber
Selain jawaban lain, debugger, menggunakan
ptrace
, biasanya memanfaatkan celah antarafork
danexec
. Seorang debuggee harus menandai dirinya sendiriPTRACE_TRACEME
untuk menunjukkan bahwa ia sedang dilacak oleh proses induknya - debugger. Ini untuk memberikan izin yang diperlukan kepada debugger.Jadi seorang debugger pertama-tama akan melakukan fork sendiri. Anak akan memanggil
ptrace
denganPTRACE_TRACEME
dan kemudian memanggilexec
. Program apa pun yang dijalankan oleh eksekutif anak sekarang dapat dilacak oleh orang tua.sumber
exec tanpa garpu
Setidaknya ada dua alasan mengapa Anda ingin melakukan hal seperti itu:
garpu tanpa exec
Itulah yang dilakukan setiap daemon setiap kali dimulai (dua kali, memang). Ini melakukan beberapa hal, di antaranya shell tidak menggantung (karena proses asli bahwa shell menunggu berakhir) dan daemon tidak lagi dikendalikan oleh terminal, jadi menutup jendela shell tidak membunuh daemon.
Penggunaan umum lainnya adalah forking pekerja anak-anak, yang dipopulerkan oleh server web apache sekitar 25 tahun yang lalu (saat ini ini tidak dianggap canggih karena sangat rentan terhadap masalah kawanan petir, tapi itu pasti memberikan sangat sederhana, server paling kuat mungkin).
Namun penggunaan umum lainnya adalah untuk membuat snapshot yang konsisten.
fork
tidak hanya menciptakan proses, tetapi juga menyalin (secara teori, pada kenyataannya itu hanya menandai halaman copy-on-write) ruang alamat. Ini (secara atomis) membuat snapshot dari data program lengkap yang tidak dapat diubah lagi oleh induknya.Beberapa program memanfaatkannya. Misalnya redis menyimpan data ke disk (dalam kondisi yang konsisten) sementara pada saat yang sama memodifikasi set data secara bersamaan. Ini hanya berfungsi karena
fork
membuat snapshot yang konsisten yang tidak melihat modifikasi yang dibuat oleh proses induk.sumber