abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×

dnes 05:00 | Bezpečnostní upozornění

Maxim Goryachy a Mark Ermolov ze společnosti Positive Technologies budou mít v prosinci na konferenci Black Hat Europe 2017 přednášku s názvem "Jak se nabourat do vypnutého počítače, a nebo jak v Intel Management Engine spustit vlastní nepodepsaný kód". O nalezeném bezpečnostním problému informovali společnost Intel. Ta bezpečnostní problém INTEL-SA-00086 v Intel Management Engine (ME), Intel Server Platform Services (SPS) a Intel

… více »
Ladislav Hagara | Komentářů: 1
dnes 01:33 | Zajímavý projekt

Na Humble Bundle byla spuštěna akce Humble Book Bundle: Java. Za 1 dolar a více lze koupit 5 elektronických knih, za 8 dolarů a více 10 elektronických knih a za 15 dolarů a více 15 elektronických knih věnovaných programovacímu jazyku Java od nakladatelství O'Reilly. Peníze lze libovolně rozdělit mezi nakladatelství O'Reilly, neziskovou organizaci Code for America a Humble Bundle.

Ladislav Hagara | Komentářů: 0
dnes 00:11 | Zajímavý projekt

Článek na OMG! Ubuntu! představuje rodinu písma IBM Plex. Jedná se o open source písmo (GitHub) navržené a uvolněné společností IBM (YouTube, Carbon Design System). Ukázka na Font Squirrel.

Ladislav Hagara | Komentářů: 3
včera 23:22 | Komunita

Na Humble Bundle lze získat počítačovou hru Brütal Legend (Wikipedie, YouTube) běžící také v Linuxu zdarma. Speciální akce končí ve středu v 19:00.

Ladislav Hagara | Komentářů: 0
včera 06:00 | Zajímavý článek

USA Network vysílá již třetí sérii seriálu Mr. Robot (Wikipedie, ČSFD.cz). Ryan Kazanciyan, technický konzultant seriálu, se na Medium v sérii článků Mr. Robot Disassembled věnuje jednotlivým dílům a popisuje použité nástroje a postupy.

Ladislav Hagara | Komentářů: 2
19.11. 23:55 | IT novinky

Společnost StartCom oficiálně oznámila, že jako certifikační autorita končí. Od 1. ledna 2018 přestane vydávat nové certifikáty a následující 2 roky bude poskytovat OCSP a CRL. Počátkem roku 2020 budou všechny platné certifikáty zneplatněny.

Ladislav Hagara | Komentářů: 21
19.11. 22:00 | IT novinky

Hodnota Bitcoinu, decentralizované kryptoměny, překonala hranici 8 000 dolarů [reddit].

Ladislav Hagara | Komentářů: 3
19.11. 21:55 | Zajímavý software

Byla vydána verze 10.0 linuxové distribuce Raspberry Digital Signage. Jedná se o distribuci pro jednodeskové počítače Raspberry Pi určenou k prezentačním účelům (veletrhy, prodejny, ...). Po naběhnutí systému je spuštěn webový prohlížeč v režimu celé obrazovky a vybraná prezentace. Nejnovější Raspberry Digital Signage vychází z distribuce Raspbian Stretch.

Ladislav Hagara | Komentářů: 0
19.11. 13:33 | Zajímavý software

Společnost Google na svém blogu věnovaném open source představila container-diff, nástroj pro analýzu a porovnávání Docker kontejnerů. Zdrojové kódy jsou k dispozici pod licencí Apache 2.0.

Ladislav Hagara | Komentářů: 0
19.11. 08:00 | Komunita

Flatpak Workshop proběhne ve středu 29. listopadu od 10:00 v Brně. V dopolední přednáškové části se účastníci seznámí s Flatpakem, se specifiky pro aplikace napsané v Qt a GTK+, portály, které integrují aplikace do systému, a na závěr, jak dostat aplikaci do Flathubu, což je momentálně největší centralizovaný repozitář Flatpaků. V odpolední části si pak mohou za pomoci lektorů zkusit nějakou aplikaci zabalit pro Flatpak. Workshop je určen pro 20 účastníků. Nutná je registrace.

Ladislav Hagara | Komentářů: 7
Jak se vás potenciálně dotkne trend odstraňování analogového audio konektoru typu 3,5mm jack z „chytrých telefonů“?
 (9%)
 (1%)
 (1%)
 (1%)
 (74%)
 (14%)
Celkem 714 hlasů
 Komentářů: 36, poslední 17.11. 18:43
    Rozcestník

    Dotaz: Problém se zombíky (zombie process)

    oryctolagus avatar 5.10.2009 20:49 oryctolagus | skóre: 29 | blog: Untitled
    Problém se zombíky (zombie process)
    Přečteno: 797×
    Ahoj, můj dotaz se týká vytváření & obsluhování child processů.
    Napsal jsem si takovouhle funkci na vytvoření pajp a nového procesu:
    bool Shell::popen3(const string& command, pid_t* pid, Pipes3 pipes)
    {
      if (!pid) return false;
      pid_t cpid;
      int p_stdin[2], p_stdout[2], p_stderr[2];
    
      if (pipe(p_stdin) || pipe(p_stdout) || pipe(p_stderr)) goto cleanup;
    
      cpid = fork();
      if (cpid < 0) goto cleanup;
      if (cpid == 0)
      {
        //child process
        close(p_stdin[P_WRITE]);
        dup2(p_stdin[P_READ], STDIN_FILENO);
        close(p_stdout[P_READ]);
        dup2(p_stdout[P_WRITE], STDOUT_FILENO);
        close(p_stderr[P_READ]);
        dup2(p_stderr[P_WRITE], STDERR_FILENO);
    
        execl("/bin/sh", "sh", "-c", command.c_str(), NULL);
        exit(-1);
      }
    
      *pid = cpid;
      pipes[P_IN] = fdopen(p_stdin[P_WRITE], "w");
      pipes[P_OUT] = fdopen(p_stdout[P_READ], "r");
      pipes[P_ERR] = fdopen(p_stderr[P_READ], "r");
    
    
      return true;
    
      cleanup:
      close(p_stdin[P_READ]); close(p_stdin[P_WRITE]);
      close(p_stdout[P_READ]); close(p_stdout[P_WRITE]);
      close(p_stderr[P_READ]); close(p_stderr[P_WRITE]);
      return false;
    }
    Celá funkce pracuje celkom dobře, akorát je problém s ukončením child processu.
    Po zavolání téhle funkce čtu stdin/stderr výstup child programu a nějak ho zpracovávám.
    Očekával jsem, že když child process skončí, napíše do stdin EOF a ukončí se.

    To se bohužel nestane - potomek místo toho přejde do zombie state a na výstup nenapíše nic.
    Můj (rodičovský) proces se tak zasekne na volání fgets/fgetc apod., očekávaje znaky k přečtení. Žádný ale v pajpě nejsou a ani nebudou, páč child je zmobie.

    Poradil by někdo, jak tohle pořešit?
    Existuje 10 druhů lidí: Ti, co nerozumí binární soustavě, ti, co ano, a ti, kteří znají i balancovanou ternární.

    Řešení dotazu:


    Odpovědi

    6.10.2009 09:08 pht | skóre: 48 | blog: pht
    Rozbalit Rozbalit vše Re: Problém se zombíky (zombie process)
    Je zde několik problémů:

    Ad zaseknutí / čtení fd:
    Po zavolání téhle funkce čtu stdin/stderr výstup child programu a nějak ho zpracovávám.
    Můj (rodičovský) proces se tak zasekne na volání fgets/fgetc apod.
    Tohle čtete jak? Správně to musíte číst oboje najednou, tj. přes select() ... ideálně, pokud budete chtít i zapisovat, tak musíte selectovat všechny 3 roury, jinak může dojít k deadlocku mezi libovolnýma dvěma: např. Vy čekáte na výstup potomka a ten čeká na vstup od Vás, nebo potomek chce zapisovat do stderr, ale ten blokuje, protože má plný buffer, protože nečtete rouru stderr, protože jste zablokován čtením roury stdout. Všechny tyto problémy řeší zmíněný select().

    Ad ukončení procesu potomka:

    Pokud potomek skončí (i neočekávaně), dostanete při čtení EOF (pokud se opravdu pokoušíte číst a nejste v deadlocku, viz výše) a při zápisu EPIPE (a signál SIGPIPE, který standardně Váš proces zabije, takže je vhodné to mít ošetřené).

    Ad zombie:

    Když potomek skončí, přejde do stavu zombie automaticky a zůstane v něm dokud si nevyzvednete jeho exit status pomocí nějakého volání z rodiny wait(). Při skončení potomka dostanete taky signál SIGCHLD, abyste věděl, že si máte status vyzvednout, záleží pak na logice Vaší aplikace, jestli to udělá hned, nebo v rámci např. čtecího cyklu.

    Management procesů je obecně netriviální záležitost. To ještě neřešíte např. ukončení potomků potomka (/bin/sh pouští další procesy), případně korektní ukončení (zabití) potomků, pokud se Vaše aplikace rozhodne skončit/spadne...
    In Ada the typical infinite loop would normally be terminated by detonation.
    oryctolagus avatar 7.10.2009 22:00 oryctolagus | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Problém se zombíky (zombie process)
    Díky za odpověď...
    Dostal jsem se k tomu až dneska, ale je jisté, že můj problém byl deadlock.
    Takže jsem si nastudoval select() a zkusil implementovat, ale chová se to teď nějak úplně divně.

    Takhle teď vypadá kód pro čtení z pajp:
      timeout.tv_sec = 5;
      timeout.tv_usec = 0;
      bool go_on = true;
      while (go_on)
      {
        FD_ZERO(&set_r);
        FD_SET(fileno(pipes[P_OUT]), &set_r);
        nfds = max(nfds, fileno(pipes[P_OUT]));
        FD_SET(fileno(pipes[P_ERR]), &set_r);
        nfds = max(nfds, fileno(pipes[P_ERR]));
        timeout.tv_sec = 1;
        timeout.tv_usec = 0;
    
        cout << "select: " << (success = select(nfds, &set_r, NULL, NULL, &timeout)) << "\n";
        if (success == -1) return false;
        go_on = false;
        while (FD_ISSET(fileno(pipes[P_OUT]), &set_r))
        {
          fgets(buffer_r, BUF_LEN, pipes[P_OUT]);
          out << "[stdout] " << buffer_r;
          go_on = true;
        }
        if (FD_ISSET(fileno(pipes[P_ERR]), &set_r))
        {
          fgets(buffer_r, BUF_LEN, pipes[P_ERR]);
          out << "[stderr] " << buffer_r << "\n";
          go_on = true;
        }
      }
    
    Tento kód vypíše pouze první řádku výstupu child procesu, potom už select() jen nulu, ačkoli když přesto čtu stdin, jsou tam znaky k přečtení. (Stdin zatím neuvažuju, dokud nerozchodím alespoň stdout a stderr.)
    Existuje 10 druhů lidí: Ti, co nerozumí binární soustavě, ti, co ano, a ti, kteří znají i balancovanou ternární.
    8.10.2009 02:11 kuly
    Rozbalit Rozbalit vše Re: Problém se zombíky (zombie process)
    nfds + 1 while -> if

    Hnus, velebnosti ;)
    8.10.2009 07:23 pht | skóre: 48 | blog: pht
    Rozbalit Rozbalit vše Re: Problém se zombíky (zombie process)
    1. Nedefinujete nfds=0
    2. Do select potřebujete dát nfds+1
    3. Dále nemůžete použít while FD_ISSET, protože fd_set je jen bitové pole, které se nastavuje tím selectem. Pokud něco přečtete teď, tak to neznamená, že můžete číst furt.
    4. Nemůžete použít fgets protože fgets používá vlastní buffer a bude číst, dokud nenarazí na "\n", čímž potenciálně zablokuje. Obecně nemůžete mixovat dvě různé vrstvy (select = syscall; fgets, fread, ... = stdio). Musíte hezky použít syscall read() a sekání na řádky si dělat sám :)
    5. Timeout můžete dát klidně na nekonečno (NULL), pokud nepotřebujete v průběhu čtení něco periodicky dělat.
    In Ada the typical infinite loop would normally be terminated by detonation.
    oryctolagus avatar 8.10.2009 09:26 oryctolagus | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Problém se zombíky (zombie process)
    Prosimvás voba to while je typo, to tam vůbec nebylo, nějak se mi to tam dostalo při copy & paste.
    nfds = 0 definuju o kousek výš, měl jsem to nakopírovat taky...
    (hernajs, to jsem si teď vysek ostudu :-D)

    Chyba bude ve fgets, díky za osvětlení. Odpoledne nebo jakmile bude čas to předělám na syscalls.
    Existuje 10 druhů lidí: Ti, co nerozumí binární soustavě, ti, co ano, a ti, kteří znají i balancovanou ternární.
    oryctolagus avatar 8.10.2009 13:22 oryctolagus | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Problém se zombíky (zombie process)
    No takže to tak nějak funguje.
    Timeout ale nemůžu nastavit na NULL (nekonečno), protože pak se dostanu tam kde jsem byl - tedy select čeká donekonečna na zombie process.
    Takže musim nastavit timeout na 0 (nebo velmi málo) a pravidelně čekovat waitpidem (s WNOHANG option), jestli child neskončil.
    Což funguje docela dobře.
    Zde ale nastává další problém, a sice: občas se stane, že waitpid mi říká, že child pid byl signálován, většinou SIGTERM ale i jiné signály. Pochvíli je ale všecko ok, child žačne vypisovat stdout a posléze se ukončí standardním exited. Tohle chování si vysvětluju tím, že parent process vstoupí do while kde čekuju select a waitpid dřív, než child process vůbec stačí nastartovat. Je to možný?
    Existuje 10 druhů lidí: Ti, co nerozumí binární soustavě, ti, co ano, a ti, kteří znají i balancovanou ternární.
    oryctolagus avatar 8.10.2009 13:36 oryctolagus | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Problém se zombíky (zombie process)
    éé bylo to no waitable state, zapomněl jsem zkontrolovat, jestli waitpid nevrací 0 při WNOHANG... eh, zbrklost, já vím... :-D
    Jo tak už to funguje pohodově. Dík za rady, pht!
    Existuje 10 druhů lidí: Ti, co nerozumí binární soustavě, ti, co ano, a ti, kteří znají i balancovanou ternární.
    8.10.2009 13:38 petr_p | skóre: 59 | blog: pb
    Rozbalit Rozbalit vše Re: Problém se zombíky (zombie process)

    Srovnejte si select(2) a pselect(2), pokud chcete řešit souběh s nastavováním obsluh signálů.

    Mimochodem timeout můžete nechat na nekončnu, protože příchodem signálu bude volání přerušeno a select() vrátí -1 a errno bude EINTR.

    oryctolagus avatar 8.10.2009 15:49 oryctolagus | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Problém se zombíky (zombie process)
    Já signály vůbec nezpracovávám, neřešim. Používám prostě jen fork(), pipe(), select(), waitpid() a tak.
    Já nevim čim to je, ale když dám NULL timeout, tak se to na volnání select() prostě zasekne.
    Takže je pro mě v této chvíli výhodnější polling s nějakým malým časovým intervalem, třeba 1ms~100ms nebo tak. V tom imho není problém.

    Amatérský názor: řek bych, že to zaseknutí select() je způsobeno tím, že než stačím v dalším kole select() zavolat, tak child skončí a tudíž po zavolání select() se už žádný signál neodešle a child je zombie, což select nepozná.
    Existuje 10 druhů lidí: Ti, co nerozumí binární soustavě, ti, co ano, a ti, kteří znají i balancovanou ternární.
    8.10.2009 17:07 petr_p | skóre: 59 | blog: pb
    Rozbalit Rozbalit vše Re: Problém se zombíky (zombie process)
    Já signály vůbec nezpracovávám
    se už žádný signál neodešle

    Tak jde o signály, nebo ne?

    Když chcípne potomek, tak čtecí konec roury vrací EOF, na což samozřejmě select() zareaguje tím, že v množině čtecích deskriptorů se objeví připravený deskriptor, ze kterého read() vrátí 0.

    8.10.2009 17:15 pht | skóre: 48 | blog: pht
    Rozbalit Rozbalit vše Re: Problém se zombíky (zombie process)
    Polling opravdu nepotřebujete.

    Select při čtení z ukončeného procesu označí fd jako že z něj de číst, ale při čtení dostanete přečteno 0 bajtů = EOF.

    Signál CHLD Vám přijde pokud ho neignorujete (nastavíte si handler).

    Ultimátní řešení je samozřejmě pselect() nebo signalfd(), případně timerfd.
    In Ada the typical infinite loop would normally be terminated by detonation.
    oryctolagus avatar 8.10.2009 18:14 oryctolagus | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Problém se zombíky (zombie process)
    Select při čtení z ukončeného procesu označí fd jako že z něj de číst, ale při čtení dostanete přečteno 0 bajtů = EOF.
    Mně se select() po skončení child procesu zasekne, pokud *timeout == NULL. Mám ověřené, že to je právě volání select(), na kterém se to zarazí.
    Signál CHLD Vám přijde pokud ho neignorujete (nastavíte si handler).
    Je nějaký zásadní důvod, proč bych to měl dělat? Polling afaik ničemu nevadí. CPU nevytěžuje.
    Existuje 10 druhů lidí: Ti, co nerozumí binární soustavě, ti, co ano, a ti, kteří znají i balancovanou ternární.
    8.10.2009 21:40 pht | skóre: 48 | blog: pht
    Rozbalit Rozbalit vše Re: Problém se zombíky (zombie process)
    Mně se select() po skončení child procesu zasekne, pokud *timeout == NULL. Mám ověřené, že to je právě volání select(), na kterém se to zarazí.

    To je asi tím že neselectujete chybové stavy (třetí fdset).
    Je nějaký zásadní důvod, proč bych to měl dělat? Polling afaik ničemu nevadí. CPU nevytěžuje.

    Maskujete si tím chybové chování.
    In Ada the typical infinite loop would normally be terminated by detonation.
    oryctolagus avatar 10.10.2009 14:54 oryctolagus | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Problém se zombíky (zombie process)
    To je asi tím že neselectujete chybové stavy (třetí fdset).
    Zkusil jsem do exceptfds dát stind a stdout pajpy, ale select() se při *timeout = NULL stále zasekává.
    Měl jsem použít exceptfds jinak? Z man select to není úplně zřejmý...
    Taky možná mohlo být tím, že nedávám nic do druhýho fdsetu, ale imho by to vadit nemělo, páč child process stejně nic ze stdin nečte (zatím, později to můžu dopsat).
    Maskujete si tím chybové chování.
    Sledovat, jestli select() nevrací -1 nestačí?
    Existuje 10 druhů lidí: Ti, co nerozumí binární soustavě, ti, co ano, a ti, kteří znají i balancovanou ternární.
    oryctolagus avatar 10.10.2009 14:59 oryctolagus | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Problém se zombíky (zombie process)
    Jo tak to bylo tím druhým fdsetem. Hodil jsem do něj stdin pajpu a už se nezasekává.
    Blbý je, že do stdin pajpy se dá zapisovat furt a je na child procesu, jestli si to přečte, takže selectem neodlišim stav, kdy child potřebuje něco číst. No ale zatim to naštěstí nepotřebuju, a asi ani potřebovat nebudu.

    exceptfds taky sleduju pro případný errory... no tak snad už to je plně košér ;-)
    Existuje 10 druhů lidí: Ti, co nerozumí binární soustavě, ti, co ano, a ti, kteří znají i balancovanou ternární.
    10.10.2009 18:40 pht | skóre: 48 | blog: pht
    Rozbalit Rozbalit vše Re: Problém se zombíky (zombie process)
    takže selectem neodlišim stav, kdy child potřebuje něco číst
    Jelikož jsou mezitím různé buffery a potenciálně nemusí být příjemce ani na stejném stroji, tak to opravdu nepoznáte. Ale nedovedu si představit situaci kde byste něco takového využil. Normální duplexní protokoly fungují na principu požadavek a odpověď.
    exceptfds taky sleduju pro případný errory... no tak snad už to je plně košér ;-)

    Když tak pro jistotu ještě ukažte jednou ten kód. Nezdá se mi, že by měl druhý fdset nějaký vliv na funkci prvního a třetího.
    In Ada the typical infinite loop would normally be terminated by detonation.
    oryctolagus avatar 10.10.2009 19:14 oryctolagus | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Problém se zombíky (zombie process)
    Když tak pro jistotu ještě ukažte jednou ten kód. Nezdá se mi, že by měl druhý fdset nějaký vliv na funkci prvního a třetího.
    Ok, ale upozorňuju, že ten kód je stále dost neučesanej, možná tam jsou proměnný navíc, instream(stdin) vyhodim, musim dodělat error handling při otevřených pajpách, ...atd.
    bool Shell::issue(const string& command, ostream& out, istream& in, int* retvalue, bool* normal_exit)
    {
      if (!retvalue) return false;                                                                      //ep_nodep
      if (!normal_exit) return false;
      if (command.empty()) return false;
    
      Pipes3 pipes;
      pid_t pid, w;
      fd_set set_r, set_w, set_err;
      int nfds = 0;
      struct timeval timeout;
      int success;
      char buffer_r[BUF_LEN];
      string buffer_w;
      int bytes;
      int child_status;
      string prefix = command.substr(0, command.find_first_of(' '));
      stringstream ss;
    
      if (!popen3(command, &pid, pipes)) return false;
    
      // interrogate child process output/(input)
      bool go_on = true;
      while (go_on)
      {
        FD_ZERO(&set_r);
        FD_SET(pipes[P_OUT], &set_r);
        nfds = max(nfds, pipes[P_OUT]);
        FD_SET(pipes[P_ERR], &set_r);
        nfds = max(nfds, pipes[P_ERR]);
        FD_ZERO(&set_w);
        FD_SET(pipes[P_IN], &set_w);
        nfds = max(nfds, pipes[P_IN]);
        FD_ZERO(&set_err);
        FD_SET(pipes[P_OUT], &set_err);
        FD_SET(pipes[P_ERR], &set_err);
        timeout.tv_sec = 0;
        timeout.tv_usec = 10000;
    
        if(select(nfds+1, &set_r, &set_w, &set_err, /*&timeout*/NULL) == -1 ) /* TODO: error */;
        if (FD_ISSET(pipes[P_OUT], &set_err)) /*error*/;
        if (FD_ISSET(pipes[P_ERR], &set_err)) /*error*/;
        //if (FD_ISSET(pipes[P_IN], &set_w)) /*always*/;
        if (FD_ISSET(pipes[P_OUT], &set_r))
        {
          bytes = read(pipes[P_OUT], buffer_r, BUF_LEN);
          buffer_r[bytes] = '\0';
          ss << buffer_r;
          while (ss.good())
          {
            ss.getline(buffer_r, BUF_LEN);
            if ((ss.gcount() > 0)  && (strlen(buffer_r) > 0)) out << " [" << prefix << "] " << buffer_r << "\n";
          }
          ss.clear(); /* TODO: jeste nejak vyprazdnit stringstream*/
        }
        if (FD_ISSET(pipes[P_ERR], &set_r))
        {      
          bytes = read(pipes[P_ERR], buffer_r, BUF_LEN);
          buffer_r[bytes] = '\0';
          ss << buffer_r;
          while (ss.good())
          {
            ss.getline(buffer_r, BUF_LEN);
            if ((ss.gcount() > 0)  && (strlen(buffer_r) > 0)) out << " [" << prefix << "] " << buffer_r << "\n";
          }
          ss.clear();
        }
        /*if (FD_ISSET(fileno(pipes[P_IN]), &set_w))
        {
          /// TODO: oddelat stdin
        }*/
    
        w = waitpid(pid, &child_status, WNOHANG|WUNTRACED|WCONTINUED);
        if (w == -1)
        {
          //TODO: error handling
          go_on = false;
        } else if (w != 0)
        {
          if (WIFEXITED(child_status))
          {
            *retvalue = WEXITSTATUS(child_status);
            *normal_exit = true;
            go_on = false;
          } else if (WIFSIGNALED(child_status))
          {
            *retvalue = WTERMSIG(child_status);
            *normal_exit = false;
            go_on = false;
          }
        }
      }
    
      pclose3(pipes);
    
      return true;
    }
    
    Nejspíš budu taky moct přehodit celou waitpid část až za smyčku, páč timeout může nyní být nekonečný.
    Existuje 10 druhů lidí: Ti, co nerozumí binární soustavě, ti, co ano, a ti, kteří znají i balancovanou ternární.
    11.10.2009 12:29 pht | skóre: 48 | blog: pht
    Rozbalit Rozbalit vše Re: Problém se zombíky (zombie process)
    Je to na dobré cestě, chtělo by to už jen dopilovat. Na error kontrolujte i P_IN. Nikdy nikam nedávejte místo ošetření chyby /*error*/, protože ignorování chyby může být zdroj potíží úplně jinde. Když jsme u toho, vidím, že se snažíte o C++, tak co třeba zkusit občas něco thrownout?
    Nejspíš budu taky moct přehodit celou waitpid část až za smyčku, páč timeout může nyní být nekonečný.

    Z principu věci by to mělo být až za smyčkou, protože smyčka by měla skončit až skončí proces (nebo při chybě). Podobně tak je možno naplnit všechny fdsety coby vzor před smyčkou a uvnitř smyčky inicializovat pracovní fdsety pomocí memcpy (select je zmodifikuje, takže inicializaci se nevyhnete, jen je to takto rychlejší).

    Poslední věc co by asi stála za zvážení je odsunout něco do separátních podprogramů, na mě je tam už moc lokálních proměnných.
    In Ada the typical infinite loop would normally be terminated by detonation.
    oryctolagus avatar 11.10.2009 14:36 oryctolagus | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Problém se zombíky (zombie process)
    Na error kontrolujte i P_IN.
    Ok, na to jsem zapomněl...
    Když jsme u toho, vidím, že se snažíte o C++, tak co třeba zkusit občas něco thrownout?
    Hm, to bych případně mohl taky. Na jiných místech programu exceptions používám, takže proč ne... ještě ten error handling nějak vymyslim a zvážím to.

    Popravdě řečeno by se mi asi nejvíc líbilo řešení, kdy funkce by vracely nějakou malou "úspěchovou" třídu, která by měla operátor přetypování na bool, pro rychlé ověření úspěchu, a v případě neúspěchu by obsahovala metody, které by vracely nějaké další informace ohledně chyb, které nastaly. Ještě uvidim.
    Podobně tak je možno naplnit všechny fdsety coby vzor před smyčkou a uvnitř smyčky inicializovat pracovní fdsety pomocí memcpy (select je zmodifikuje, takže inicializaci se nevyhnete, jen je to takto rychlejší).
    Jj, měl jsem tam dřív něco jako tmp_set_r a další, ale oddělal jsem je, protože jsem při hledání chyb podezříval kde co. Zas to dám zpátky.
    Poslední věc co by asi stála za zvážení je odsunout něco do separátních podprogramů, na mě je tam už moc lokálních proměnných.
    Tjn, je toho tam trochu moc, taky už mi to vadí. Nějak to časem pořešim.
    Mít tak víc volnýho času, věčný to problém... ;-)
    Existuje 10 druhů lidí: Ti, co nerozumí binární soustavě, ti, co ano, a ti, kteří znají i balancovanou ternární.
    11.10.2009 18:53 pht | skóre: 48 | blog: pht
    Rozbalit Rozbalit vše Re: Problém se zombíky (zombie process)
    Popravdě řečeno by se mi asi nejvíc líbilo řešení, kdy funkce by vracely nějakou malou "úspěchovou" třídu,
    Smysl výjimek je v tom, že nemusíte vracet nic (a obvykle to co říkáte je pokryto více typy výjimek). Kód pak není přecpán if-y a navíc se obrací logika ignorace chyby - pokud s ní nic neuděláte tak program skončí, verzus pokud ignorujete návratovou hodnotu, tak se nestane nic.
    Mít tak víc volnýho času, věčný to problém... ;-)

    Ten mám taky. Proto se snažím dokumentovat a psát pořádně hned od prvního řádku, abych pak po půl roce neměl chuť se za ten bordel nakopat do zadku.
    In Ada the typical infinite loop would normally be terminated by detonation.
    11.10.2009 12:32 pht | skóre: 48 | blog: pht
    Rozbalit Rozbalit vše Re: Problém se zombíky (zombie process)
    Maskujete si tím chybové chování.
    Sledovat, jestli select() nevrací -1 nestačí?
    Chtěl jsem tim říct, že obcházíte něco, co "nefunguje" jak by mělo.
    In Ada the typical infinite loop would normally be terminated by detonation.

    Založit nové vláknoNahoru

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.