Uczę się o poleceniach fork () i exec (). Wygląda na to, że fork () i exec () są zwykle wywoływane razem. (fork () tworzy nowy proces potomny, a exec () zastępuje bieżący obraz procesu nowym). Jednak w jakich scenariuszach można wywoływać każdą funkcję osobno? Czy są takie scenariusze?
system-calls
exec
fork
kołdra
źródło
źródło
Odpowiedzi:
Pewnie! Częstym wzorcem w programach „otokowych” jest robienie różnych rzeczy, a następnie zastępowanie się innym programem z tylko
exec
wywołaniem (bez rozwidlenia)Prawdziwym przykładem tego jest
GIT_SSH
(choćgit(1)
oferuje również,GIT_SSH_COMMAND
jeśli nie chcesz wykonać powyższej metody programu opakowania).Widelec jest używany tylko podczas odradzania wielu typowo procesowych procesów roboczych (np. Apache
httpd
w trybie rozwidlenia (chociaż tylko rozwidlenie lepiej pasuje do procesów, które wymagają spalenia procesora, a nie do tych, które wykręcają kciuki w oczekiwaniu na sieciowe operacje we / wy) ) lub do separacji uprawnień używanych przezsshd
i inne programy w OpenBSD (bez exec)root
Sshd jest na klienckie łączą rozwidlony off kopią sobie (28571), a następnie innym egzemplarzu (14625) do rozdzielania uprawnień.źródło
Jest wiele.
Programy, które wywołują „
fork()
bez”,exec()
zwykle wykonują wzorce odradzania procesów potomnych w celu wykonania różnych zadań w oddzielnych procesach od głównego. Znajdziesz to w programach tak różne, jakdhclient
,php-fpm
iurxvtd
.Program, który wywołuje
exec()
bezfork()
jest łańcuchem ładowania , nakładając swój proces z programu innego obrazu. Istnieje cała subkultura narzędzi do ładowania łańcucha, które wykonują określone czynności w celu przetworzenia stanu, a następnie wykonują inny program, aby uruchomić ten zmieniony stan procesu. Takie narzędzia są powszechne w rodzinie usług i zestawów narzędzi do zarządzania systemem daemontools , ale nie są do nich ograniczone. Kilka przykładów:chpst
z runitu Gerrita Pape'as6-softlimit
is6-envdir
od s6 Laurenta Bercotalocal-reaper
imove-to-control-group
z mojego zestawu narzędzi noshrdprio
iidprio
na FreeBSDnumactl
na FreeBSD i LinuxRodzina zestawów narzędzi daemontools ma wiele takich narzędzi, od
machineenv
dofind-matching-jvm
doruntool
.źródło
Oprócz innych odpowiedzi, debugery, używając
ptrace
, zazwyczaj wykorzystują lukę międzyfork
iexec
. Debugowany powinien zaznaczyć się,PTRACE_TRACEME
aby wskazać, że jest śledzony przez proces nadrzędny - debugger. Ma to na celu nadanie debuggerowi wymaganych uprawnień.Debugger najpierw sam się rozwidli. Dziecko nazwałbym
ptrace
zPTRACE_TRACEME
, a następnie zadzwonićexec
. Niezależnie od tego, który program wykonywany przez dziecko będzie teraz możliwy do śledzenia przez rodzica.źródło
exec bez widelca
Istnieją co najmniej dwa powody, dla których chcesz zrobić coś takiego:
widelec bez exec
Tak właśnie robi każdy demon za każdym razem, gdy jest uruchamiany (rzeczywiście dwukrotnie). Robi to kilka rzeczy, między innymi powłoka nie zawiesza się (ponieważ oryginalny proces, na który czeka powłoka, kończy się), a demon nie jest już kontrolowany przez terminal, więc zamknięcie okna powłoki nie zabije demona.
Innym powszechnym zastosowaniem jest rozwidlanie dzieci robotniczych, które zostało zasłyszane przez serwer WWW Apache około 25 lat temu (obecnie nie jest to już uważane za najnowocześniejsze ze względu na to, że jest bardzo podatne na problem stada grzmotów, ale z pewnością zapewnia najprostszy, najsolidniejszy możliwy serwer).
Jeszcze innym powszechnym zastosowaniem jest tworzenie spójnej migawki.
fork
nie tylko tworzy proces, ale także kopiuje (teoretycznie w rzeczywistości zaznacza tylko strony kopiuj przy zapisie) przestrzeń adresową. To (atomowo) tworzy migawkę kompletnych danych programu, których rodzic nie może już modyfikować.Niektóre programy wykorzystują to. Na przykład redis zapisuje dane na dysku (w spójnym stanie), jednocześnie modyfikując jednocześnie zestaw danych. Działa to tylko dlatego, że
fork
utworzono spójną migawkę, która nie widzi modyfikacji dokonanych przez proces nadrzędny.źródło