PDA

Visualizza la versione completa : [C] Funzione waitpid() che non aspetta


magicofred
27-06-2007, 02:00
while(1){
isfork = fork ();
if (isfork == 0)
{
execl("/bin/sleep", "sleep", "10", 0);
}
else
{
waitpid(isfork,&status,1);

}
}


Perchè in questo caso la waitpid non aspetta mai la fine dello sleep provocando un loop infinito lanciando sempre uno sleep?? controllando nei processi gli sleep vengono lanciati, per semplicità non ho scritto l'intero codice, ma in sostanza questo è il problema...
come possi risolverlo??
grazie anticipatamente..

donato.sciarra
27-06-2007, 11:09
come ultimo parametro della execl devi passare NULL non 0 !

magicofred
27-06-2007, 12:48
è indifferente.. non cambia..
alemno nel mio codice... :)

Mods
27-06-2007, 13:53
Non vorrei dire una stupidata, ma secondo me è la execl che aveva certe particolarità nel sostituirsi al processo (che purtroppo in questo momento la memoria mi inganna)

se utilizzi una "sleep(10);" anziché la execl vedrai che funziona... altrimenti c'è qualche parte del codice che non ci hai mostrato che crea il problema.

magicofred
27-06-2007, 14:30
a me non interessa fare una sleep, ho messo la sleep perchè è l'unico modo per testare se il padre aspetta il figlio.. dovrebbe funzionare per qualsiasi comando.. vi chiedo.. è possibile che sia una "limitazione" del mio linux? io uso una slackware 10.3 .

donato.sciarra
28-06-2007, 00:08
non credo possa essere una limitazione del tuo linux :master:

fai un pò queste prove:

1 ) nel programma che invochi tramite execl mettici un for che stampi tutte le variabile ricevute in modo da avere la certezza che riceve cio che li passi !

2) in fase di compilazione di entrambi i programmi ricevi warning?

3) prova ad usare la execlp passandole come secondo parametro lo stesso che gli passi per primo

4) ultima stupida prova : sostiutisci la waitpid con una wait(&stato); //attende la chiusura di un qualsiasi figlio e non di uno specifico

. . .lo so nn sono granchè come prove ma a volte questi problemi derivano proprio da piccole sviste

:ciauz:

magicofred
28-06-2007, 09:08
se metto la wait(&status) il programma funziona correttamente, però il programma che lnacio con exec diventa defunto... come posso evitare che accada??

donato.sciarra
28-06-2007, 10:21
se la sostituisci nel programmino senza modificare nient'altro il programma che parte con la exec non diventa defunto ! ! !
Il tuo programma padre (che genera il figlio) va a finire nell'else dove si metterà in attesa di un qualisiasi figlio creato ma se ne ha creato solo uno fino a quel momento aspetterà la chiusura di quello; l'uso della waitpid di solito va combinato memorizzando tuttti i pid creati ma nel tuo caso non serve . . .

. . .se non ho capito chiedi pure :ciauz:

magicofred
28-06-2007, 15:53
in teoria è giusto quello che dici.. ma non funziona :D

pieric27
28-06-2007, 18:03
prova a mettere solo wait(&status)!!!

Loading