fork/exec jeste jednou

David Sauer davids na iol.cz
Čtvrtek Leden 7 23:41:04 CET 1999


>>>> "Petr" == Petr Novotny <Petr.Novotny na antek.cz> writes:

    >> setpgrp nastavuje nove "id skupiny procesu". Pokud totiz
    >> program(demon) neprovede nastaveni noveho id, lze ho ovlivnit
    >> signalem zaslanym prislusne skupine procesu odforkovanych od
    >> spolecneho predka (tedy od predka, ktery provedl setpgrp, jinak je
    >> spolecnym predkem proces init).

    Petr> Zatim v tom plavu: Predpokladejme kod ve tvaru

    Petr> pid_t pid=fork();
    Petr> if (pid==-1)
    Petr> { // a sakra!
    Petr> }
    Petr> else if (pid==0)
    Petr> {
    Petr>   setpgrp();
    Petr>   exec("nejaky proces",...);
    Petr> }
    Petr> else
    Petr> {
    Petr>   return;
    Petr> }

    Petr> Predpokladejme, ze return je nekam uplne pryc, a ze tento program ani
    Petr> jeho rodic nic nevedi o tom, ze mohl existovat nejaky "nejaky
    Petr> proces". Co se stane? Vyzombi se mi "nejaky proces" anebo ne?

No, mohl sis to zkusit. Ale samozrejmne ze se vyzombi, protoze parent
nedal najevo, ze nestoji o navratovy status potomka [to udela onim
volanim signal(SIGCLD, SIG_IGN)].
  Volani setpgrp s tim nesouvisi, je to jen k tomu, aby odforkovany
 (a execnuty) proces [to je teda cestina :-)] nebylo mozno ovlivnit
 jako clena skupiny procesu od jednoho predka(v tomto pripade je
spolecnym predkem init). Priklad:

       	       	       	   init
			    | (fork)
                           init1 (vola setpgrp)
                            | (exec)
                           demon

V takovem minisystemu budou dve procesove skupiny: skupina 1 s
procesem init (id skupiny procesu = pid procesu init) a skupina 2 s
procesem demon (id skupiny procesu = pid procesu init1, po execu
demon). Pokud by proces demon odforkoval proces demon1, a nebylo
 pritom provedeno setpgrp, proces demon1 by take patril do skupiny
 procesu demon.

--
* David Sauer, student of Czech Technical University
* electronic mail: davids na iol.cz (mime compatible)


Další informace o konferenci Linux