Newsgroup: it.comp.os.linux.development
Titolo: fork & kill

Salve,
il mio programma in C genera un nuovi processo con l'istruzione fork(), il
padre prosegue la sua attività, il figlio esegue una "execl(command, arg1,
arg2, 0);"
La fork restituisce un pid che e' quello del processo figlio. (con una
esterna pstree -p da riga di comando vedo che il pid e' proprio quello del
processo figlio)
Ho riscontrato che se provo ad effettuare un kill sul pid restituito, questo
viene ignorato. Ho provato da terminale con kill -9 pid, ma non riesco ad
ammazzare questo processo figlio fin tanto che il padre rimane vivo.
Dove sto sbagliando? Forse il comando "execl" da di queste conseguenze?
Come procedere per ammazzare il figlio lasciando incolume il padre?
Grazie
Gerardo
--------------------------------
Inviato via 
http://usenet.libero.it

 Dove sto sbagliando? Forse il comando "execl" da di queste conseguenze?
Non penso proprio, secondo me e' questione di una wait 
tralasciata qua o la'
Naturalmente tutto IMHO.
-- 
Trimack -- GPGKey 61A6ABFD on 
keyserver.linux.it
"Running Windows on a Pentium is like having a brand new Porsche but only
be able to drive backwards with the handbrake on."

 rimane vivo.
Avanzo una ipotesi: devi chiamare waitpid? 
-- 
HappyCactus - Linux User #209744 - 
http://pngstego.sourceforge.net
 
 
www.google.com
 - 
groups.google.com
/* Ci sono 10 categorie di persone al mondo: quelle che capiscono */
/* il sistema binario e quelle che non lo capiscono.              */

 Come procedere per ammazzare il figlio lasciando incolume il padre?
Se il padre, dopo aver generato i figli, deve continuare a fare altro, credo
che tu non debba usare una wait()/waitpid() essendo queste funzioni
sospensive...
Se gli fai un kill -9 pid, a me sembra strano che non ti ammazzi il processo
(che italiano... x questo dovrei fare un kill -9 Corrado ;) ).
Fagli fare un top e guarda se lo status del figlio e' 'Z' = Zombie.
IMHO!
Bye
Corrado
-- 
FrEe ThE kNoWlEdGe


--------------------------------
Inviato via 
http://usenet.libero.it

 fare ad eliminare un processo divenuto zombie?
Un processo zombie e` un processo morto del quale esiste solamente il 
valore d'uscita (i.e. quello passato a exit() o al return in main()).
Finche` il padre del processo continua ad esistere, e finche` esso non 
recupera il valore d'uscita del figlio, anche il figlio continera` ad 
esistere in forma zombificata.
Se vuoi creare un processo indipendente dal padre, fai forkare di nuovo 
il figlio per creare un nipote, e fai terminare il figlio. Il padre deve 
ovviamente andare di wait() o waitpid(), cosi` da evitare che il figlio 
rimanga zombie. Il nipote viene adottato da init (pid 1).
Dopodiche`, se vuoi che il nipote sia un vero demone, occorre fare altre 
cose ancora (i.e. staccarlo dal terminale e dal process group del padre 
via setpgid()).
-- 
   |   \    \  | ___|_  |_  | ianezz a casa sua... :-)
   |  _ \  | \ | _|    /   /  Visita il LinuxTrent a
  _|_/  _\_|  _|____|___|___| 
http://www.linuxtrent.it

 fare ad eliminare un processo divenuto zombie?
Fai forkare nuovamente il figlio!
prova una cosa di questo tipo
pid==fork(); /*Processo padre*/
if(pid==0) { /*Processo figlio*/
        pid=fork();
        if(pid==0) { /*Processo nipote*/
                exec();
        }
 
        else { /*Processo figlio, che va a morire ;)*/
                exit(0);
        }
}
else { /*Processo padre*/
        wait(); //Questa e' un attesa pressoche' inesistente in quanto
                //il processo figlio muore subito
        altre_funzioni_padre();
}
Spero che sia giusto e che ti possa aiutare.
Ciao!


 Spero che sia giusto e che ti possa aiutare.
Giusto e` giusto, ma non necessario. In realta` basterebbe che il padre chiamasse 
waitpid all'interno di un signal handler per SIGCHLD. 
Ciao
Simone