Newsgroup: it.comp.programmare
Titolo: wait3() in un proxy server..... a che serve?

ciao,
io ho un proxy che dopo essersi messo in ascolto sulla porta, fà così:
*************
signal(SIGCHLD, ReleaseChild);
if((chpid=fork())==0) {
            /* ----- Child process ----- */
            close(netd);      ----> socket padre
            Reception(fd, &from);  ----> gestisce l'invio della risorsa
richiesta.
            exit(0);
        }
        else {
            /* ----- Parent process ----- */
            close(fd);      ----> socket figlio
        }
***************
Il problema che non capisco è l'utilità di quella funzione di gestione del
segnale SIGCHLD
(tra parentesi, ho provato a toglierla, e tutto funziona apparentemente
uguale)
la funzione di gestione è questa:
*******************
void ReleaseChild()
{
    /* union wait */
    while(wait3(NULL, WNOHANG, (struct rusage*) 0) >= 0 )
        ;
}
******************
potete darmi qualche aiuto?

 potete darmi qualche aiuto?
Quando il processo figlio termina la sua esecuzione, le risorse occupate
non vengono  liberate, e si  crea un processo zombie. Al  processo padre
arriva pero` il segnale SIGCHLD che indica che l'esecuzione di un figlio
e` terminata. A  questo punto usando  la funzione wait3() (stile  BSD) o
wait() (POSIX) il padre libera le risorse occupate.
Il  tuo  programma funziona  anche  senza  questa  funzione, ma,  se  il
processo rimane  in esecuzione per  molto tempo, potrebbero  crearsi dei
problemi di memoria.
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
Un apostolo vedendo Gesu` camminare sulle acque:
- Cazzo se e` buono 'sto fumo!!!

 problemi di memoria.
non riesco a capire perchè, nonostante la presenza della wait, si creano lo
stesso i figli zombi!!! :(
grazie, per l'aiuto, spero puoi darmene ancora un pò :)

 }
Quando un il processo figlio muore e il padre non ne intercetta con una
wait il valore di ritorno, rimane in stato di 'zombie'. Per evitare questa
cosa si sfrutta il fatto che alla morte del figlio, il processo padre
riceve il segnale SIGCHLD: basta intercettare il segnale per sapere quando
si puo' catturare lo stato del figlio defunto, cosi' da non lasciare
'zombie' in giro.
-- 
 Ciao, Bianco.
 Reply to luca.bianco (at) 
tiscalinet.it

 'zombie' in giro.
ma il valore di ritorno lo devo quindi far scrivere mediante una wait()
dentro un int status?
io ho messo una signal (SIGCHLD, handler)
e l'handler era appunto fatto con la wait, solo che gli zombi ci sono lo
stesso :(

 stesso i figli zombi!!! :(
Perche` probabilmente ci sono morti multiple, e solo l'ultima viene
intercettata dalla funzione. Modifica l'heander cosi`:
void child_handler (int useless) {
	pid_t pid;
	while(1) {
		pid = waitpid(WAIT_ANY, NULL, WNOHANG);
		if (pid < 0) {
			/* Errore */
			fprintf(stderr, "%s\n", strerror(errno));
			break;
		}
		if (pid == 0)
			break;
	}
}
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
"Woe to you, Oh Earth and Sea,
 for the Devil sends out the beast with wrath,
 because he knows the time is short...
 Let him who had understanding reckon the number of the beast
 for it is a human number, its number is Six hundred and sixty six."
Revelations ch XIII, b. 18

> Modifica l'heander cosi`:
[ ... CUT ...]
acc, l'ho modificato e non funziona uguale! :((
ma come cavolo è possibile ? :(

> pid = waitpid(WAIT_ANY, NULL, WNOHANG);
invece di come hai detto, ho scritto la waitpid in questo modo:
waitpid(-1, NULL, WNOHANG)
perchè mi diceva che WAIT_ANY non era definita.
.... è uguale, oppure devo usare per forza WAIT_ANY ?

 perche` mi diceva che WAIT_ANY non era definita.
#include <sys/types.h>
#include <sys/wait.h>
Cmq e` uguale.
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
La differenza fra l'intelligenza e la stupidita`?
All'intelligenza c'e` un limite.

 #include <sys/wait.h>
oh si si, questi li avevo messi nel file header.
cmq nonostante tutto non funziona.... :(
invece ho provato a modificare la signal in questo modo:
signal (SIGCHLD, SIG_IGN)
e cosě funziona, cioč gli zombi scompaiono !!!
mah :)

 ma come cavolo e` possibile ? :(
Devo smetterla di giocare con NetBSD... su linux bisogna reimpostare
l'handler:
void handler (int useless) {
	....
	signal(SIGCHLD, handler);
}
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
Todo list:
 1: Feed Cat.
 2: Take over the world.
 3: Feed Cat.
 4: Get lots of cookies.
 5: Eat the cookies.
 6: Feed Cat.
 7: Escape from jail.
 8: Feed Cat.
 9: Take over the world again.
10: goto #6

 }
azz grande! :)
ci provo subito!
grazie

funziona !! grazie!!! :)
ciao
Casper
PS:
il codice l'ho riscritto per compattezza in questo modo:
void ReleaseChild()
{
    pid_t pid;
    while((pid = waitpid(0, NULL, WNOHANG | WUNTRACED)) > 0)
         printf("ReleaseChild: %d.\n", pid);
    signal(SIGCHLD, ReleaseChild);
}