Programovani - fork, exec a spol. (uz dost dlouhe)

David Sauer davids na iol.cz
Pátek Leden 8 08:05:52 CET 1999


>>>> "David" == David Sauer <davids na iol.cz> writes:

>>>> "Petr" == Petr Novotny <Petr.Novotny na antek.cz> writes:
    >>> Myslim, ze jedina moznost je, aby parent provedl 'signal(SIGCLD,
    >>> SIG_IGN)'. Tim oznami, ze nema o exit status potomka zajem. Pokud
    >>> to nemuze udelat, jak moc vadi ty zombie ?

    Petr> Krome toho, ze jsou neesteticke :-) je hlavni problem v tom, ze by 
    Petr> pri kazde POP3 autentifikaci vznikl jeden.

    David> Spise jde o to, jak takovy autentizacni proces bezi. Pokud se startuje
    David> pokazde znovu, detske zombie (fuj, to je slovo) by nevadily. Pokud
    David> bezi porad, tak by zombie asi zaplnovaly tabulku procesu, az by ji
    David> zaplnily...
    David>   Jinak, signal(..) lze preci provest v odforkovanem procesu(nebo
    David> ne?),  asi takto:

Teda, to jsem to zamlzil. A navic jsem v tom vypisu to volani signal
zapomnel. V tomto pripade neni samozrejmne treba signal(...)
volat. Prvni detsky proces (PID = pid) skonci okamzite. Pokud by
nahodou detsky proces tohoto destskeho procesu(tedy proces /bin/ls)
skoncil  drive, bude zombie existovat jen kratky cas. Takze volani
signal by bylo je pro forma.

    David> #include <stdio.h>
    David> #include <stdlib.h>
    David> #include <signal.h>

    David> int main()
    David> {
    David> 	// nedela zadne kontroly
    David>   pid_t pid = fork();

    David>   if( pid == 0 )
    David>     { // jsem dite
		// ten zapomenuty signal()
		// snad jen kdyby proces nevolal okamzite exit(0)
		// ale jeste neco pocital ...
                 signal( SIGCLD, SIG_IGN); // neni nezbytne treba
    David>       if( fork() == 0 )
    David> 	   execl("/bin/ls", "ls", NULL);
    David>       else
    David> 	   exit(0);
    David>     }
    David>   else
    David>     { // jsem rodic
    David>       int status;
    David>       int options = 0;
      
	         // wait() nebo waitpid()
    David>       waitpid( pid, &status, options );
    David>       while(1);
    David>     }
    David>   return 0;
    David> }

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


Další informace o konferenci Linux