Kiedy samodzielnie wywoływać fork () i exec ()?

9

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?

kołdra
źródło
2
Tradycyjny widelec: while (1) fork (); przechwytywać zasoby systemowe.
Jozuego

Odpowiedzi:

22

Pewnie! Częstym wzorcem w programach „otokowych” jest robienie różnych rzeczy, a następnie zastępowanie się innym programem z tylko execwywołaniem (bez rozwidlenia)

#!/bin/sh
export BLAH_API_KEY=blub
...
exec /the/thus/wrapped/program "$@"

Prawdziwym przykładem tego jest GIT_SSH(choć git(1)oferuje również, GIT_SSH_COMMANDjeśli nie chcesz wykonać powyższej metody programu opakowania).

Widelec jest używany tylko podczas odradzania wielu typowo procesowych procesów roboczych (np. Apache httpdw 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 przez sshdi inne programy w OpenBSD (bez exec)

$ doas pkg_add pstree
...
$ pstree | grep sshd
 |-+= 70995 root /usr/sbin/sshd
 | \-+= 28571 root sshd: jhqdoe [priv] (sshd)
 |   \-+- 14625 jhqdoe sshd: jhqdoe@ttyp6 (sshd)

rootSshd jest na klienckie łączą rozwidlony off kopią sobie (28571), a następnie innym egzemplarzu (14625) do rozdzielania uprawnień.

gałązka
źródło
14

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, jak dhclient, php-fpmi urxvtd.

Program, który wywołuje exec()bez fork()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:

Rodzina zestawów narzędzi daemontools ma wiele takich narzędzi, od machineenvdo find-matching-jvmdo runtool.

JdeBP
źródło
2

Oprócz innych odpowiedzi, debugery, używając ptrace, zazwyczaj wykorzystują lukę między forki exec. Debugowany powinien zaznaczyć się, PTRACE_TRACEMEaby 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 ptracez PTRACE_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.

bytefire
źródło
Istnieje wiele przykładów robienia rzeczy między rozwidleniem a exec, najczęstszym z nich jest przekierowywanie we / wy (np. Konfigurowanie potoków). Ale pytanie dotyczy robienia wideł bez żadnego exec.
Barmar
0

exec bez widelca

Istnieją co najmniej dwa powody, dla których chcesz zrobić coś takiego:

  1. Ładowanie łańcucha Obecny obraz procesu jest zastępowany czymś innym.
  2. Ponowne uruchomienie aktualnie uruchomionego programu (może się na przykład zdarzyć, gdy ZASOBNIK lub taki proces serwera, przeładowanie wszystkiego i zupełnie nowy start). W pewien sposób można argumentować, że to ładowanie łańcucha, tylko przypadkowo z tym samym programem.

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. forknie 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 forkutworzono spójną migawkę, która nie widzi modyfikacji dokonanych przez proces nadrzędny.

Damon
źródło
Obecnie jest bardzo mało demonów, z których większość nie robi tego w standardzie lub nie używa często używanego trybu. Błędem jest rozwidlenie prowadzące do niedopasowania gotowości i horrorów , i jest jednym z błędów błędnego przekonania . Ten błąd w końcu ostatecznie popadł w niełaskę.
JdeBP