Portál AbcLinuxu, 31. října 2025 13:30
Řešení dotazu:
setpgid(0,getppid()) a parent zavolá setpgid(0,0) - tak by malo stačiť zavolať waitpid(0,&status,0).
Daj vedieť, či to zafunguje.
             25.4.2012 23:27
mess             | skóre: 43
             | blog: bordel
             | Háj ve Slezsku - Smolkov
        25.4.2012 23:27
mess             | skóre: 43
             | blog: bordel
             | Háj ve Slezsku - Smolkov
        fork() vyleze PID potomka. Takže by mělo stačit si ty PID někde poznačit a pak volat normálně wait(pid) na každý ten PID. Tím se zajistí, že se bude pokračovat, až všchni potomci vychcípou.
            A priori to problém není, protože stejně nechcete pokračovat dál, dokud neskončí všichni, a zpoždění dané tím, že pak ještě několikrát zavoláte waitpid() na potomky, kteří už dávno skončili, je zanedbatelné. Na druhou stranu, při téhle metodě vám v systému mohou poměrně dlouho (v závislosti na tom, s jakými odstupy potomci končí) viset zombie, což nepatří k dobrým mravům.
Osobně bych to řešil spíš tak, že budu v cyklu volat waitpid(-1, …), dokud neskončí všichni potomci. Pokud chcete být opatrný, můžete si potomky "odškrtávat" (udržovat příznak, kdo už skončil), jinak stačí evidovat počet dosud běžících (a čekat, až klesne na nulu).
V každém případě je ale potřeba dávat pozor na to, že to, že návratová hodnota waitpid() je PID potomka, ještě automaticky neznamená, že potomek opravdu skončil (je potřeba kontrolovat status).
 27.4.2012 13:54
xkucf03             | skóre: 49
             | blog: xkucf03
        27.4.2012 13:54
xkucf03             | skóre: 49
             | blog: xkucf03
            
        a zpoždění dané tím, že pak ještě několikrát zavoláte waitpid() na potomky, kteří už dávno skončili, je zanedbatelné.A nemůže se stát, že by některý z mých procesů skončil a mezitím se v systému objevil jiný (cizí) se stejným číslem a já pak čekal na něj, což nechci?
 27.4.2012 13:57
xkucf03             | skóre: 49
             | blog: xkucf03
        27.4.2012 13:57
xkucf03             | skóre: 49
             | blog: xkucf03
            
         
All of these system calls are used to wait for state changes in a child of the calling process
 27.4.2012 15:33
mess             | skóre: 43
             | blog: bordel
             | Háj ve Slezsku - Smolkov
        27.4.2012 15:33
mess             | skóre: 43
             | blog: bordel
             | Háj ve Slezsku - Smolkov
        
for(j = 0; j < 5; j++)
  {
     waitpid(-1, NULL, 0);
  }
Hlavní proces bude čekat, než se ukončí 5 procesů a pak si povalí dál.
Vypadá, že to funguje. Co si o tom myslíte?
             27.4.2012 21:59
mess             | skóre: 43
             | blog: bordel
             | Háj ve Slezsku - Smolkov
        27.4.2012 21:59
mess             | skóre: 43
             | blog: bordel
             | Háj ve Slezsku - Smolkov
        
while(wait() > 0) { /* no-op */ ; }
            
        Tiskni
            
                Sdílej:
                 
                 
                 
                 
                 
                 
            
    
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.