Uživatelské nástroje

Nástroje pro tento web


fork

Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

Následující verze
Předchozí verze
fork [2015/09/22 16:33] – vytvořeno djbuldogfork [2025/08/28 10:09] (aktuální) – upraveno mimo DokuWiki 127.0.0.1
Řádek 5: Řádek 5:
   * proces pozná, zda je potomek nebo rodič, podle návratové hodnoty fork   * proces pozná, zda je potomek nebo rodič, podle návratové hodnoty fork
  
-<code>+<code c>
 pid_t pid = fork(); pid_t pid = fork();
  
Řádek 17: Řádek 17:
   // parent   // parent
  
 +</code>
 +
 +  * pokud je ukončen rodičovský proces, z potomka se stane sirotek (orphan)
 +  * pokud je ukončen potomek před rodičem, stává se nemrtvým (zombie)
 +
 +===== likvidace zombie procesů =====
 +
 +  * zombie je proces, který skončil provádění kódu, ale zůstal zapsán v tabulce procesů, aby si rodičovský proces mohl přečíst jeho návratovou hodnotu.
 +  * zombie zůstává v "Terminated state", dokud s tím rodič něco neudělá.
 +
 +  * blokující wait()
 +    * funkce wait čeká na ukončení potomka. 
 +    * zavoláme v kódu po vytvoření potomka. Čekání blokuje proces
 +  
 +  * neblokující wait() 
 +    * zaregistrujeme handler, který při příjmu signálu SIGCHLD zavolá wait()
 +
 +  * zrušení potřeby wait()
 +    * zaregistrujeme handler SIG_IGN a nastavíme flag SA_NOCLDWAIT
 +    * systém pak ukončené potomky rovnou zapracovává
 +
 +<code c>
 +struct sigaction sa;
 +sa.sa_handler = SIG_IGN;
 +sa.sa_flags = SA_NOCLDSTOP | SA_NOCLDWAIT;
 +sigaction(SIGCHLD, &sa, NULL);
 +</code>
 +
 +  * double fork
 +    * vytvoříme potomka a v něm dalšího.
 +    * prvního potomka zabijeme, čímž uděláme z potomka dalšího sirotka
 +    * tohle řešení se prý používá nejčastěji, protože přináší další výhody jako odpojení stdin/out/err od mateřského procesu atd.
 +
 +<code c>
 +pid_t pid1, pid2;
 +pid1 = fork();
 +
 +if (pid1 == -1) {
 + // fork failed
 + exit(1);
 +}
 +
 +if (pid1 == 0) {
 + // child
 + pid2 = fork(); //second fork
 + if (pid2 == -1) {
 + // fork failed
 + exit(1);
 +
 +
 + if (pid2 == 0) {
 + // child
 + ret = system(cmd);
 + exit(ret);
 +
 +
 + // parent
 + exit(0);
 +
 +
 +//parent
 +waitpid(pid1, &ret, 0);
 +
 </code> </code>
fork.1442932398.txt.gz · Poslední úprava: (upraveno mimo DokuWiki)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki