Visualizzazione dei risultati da 1 a 7 su 7

Discussione: la wait() di C

  1. #1

    la wait() di C

    Ciao a tutti!
    Premetto che sono un principinante di C!

    Ho un problema nell'utilizzo della wait().
    Credo che la cosa sia dovuta al fatto che mi sfugge qualcosa sul comportamento della wait... ...ma non capisco cosa.
    L'esercizio che devo fare richiede quanto segue:

    1) Vi è un processo padre che crea un figlio con la fork()
    2) Il padre si mette in attesa del figlio tramite wait()
    3) Il figlio termina
    4) Il padre prosegue e crea un altro figlio con la fork
    5) Il padre invoca un'altra wait per attendere le fine di questo figlio.

    Ora vi riporto il mio codice che non riesco a capire perchè, non effettua l'attesa sul secondo figlio. Il programma è semplicissimo e oltre a creare i figli come detto sopra, fa solo delle stampe a video. (ho messo anche dei commentini per farvi sbattere il meno possibile)

    codice:
    #include <signal.h>
    #include <sys/types.h>
    #include <unistd.h>
    #include <stdio.h>
    
    int main()
    {
    	int id;	//variabili di servizio usate solo per recuperare
    	int id1;//gli ID dei processi per distinguere padre da iglio.
    
    	id=fork();
    	
    	if(id == 0)	//codice eseguido dal primo figlio.
    	{
    		id1=getpid();
    		printf("ID= %d - Io sono il primo figlio!\n", id1);
    		sleep(3);
    		printf("Primo figlio terminato\n");
    		exit(0); //Qui termina il primo figlio
    	}
    	
    	/*Codice eseguito solo dal padre*/	
    	id1=getpid();	//restituisce il proces id di chi lo invoca
    	printf("ID= %d - Io sono il padre!\n", id1);
    	printf("Attendo la fine del primo figlio!\n");
    	wait();	//mette in attesa della fine di un figlio.
    	
    	id=fork();
    
    	if(id == 0)	//codice eseguido dal secondo figlio.
    	{
    		id1=getpid();
    		printf("ID= %d - Io sono il secondo figlio!\n", id1);
    		sleep(3);
    		printf("Secondo figlio terminato\n");
    		exit(0);  //Qui termina il secondo figlio
    	}
    	
    	/*Codice eseguito solo dal padre*/
    	printf("ID= %d - Io sono il padre!\n", id1);
    	printf("Attendo la fine del secondo figlio!\n");
    	wait();	//mette in attesa della fine di un figlio.	
    	printf("Padre terminato, Fine dell'esercizio!\n");	
    	exit(0);
    }
    Se provate a farlo girare avrete che:
    1) Parte il padre e parte il primo figlio
    2) Il padre attende il primo figlio
    3) Il primo figlio termina
    4) Parte il secondo figlio
    5) Termina il padre
    6) Passati i 3 secondi della sleep termina il secondo figlio.

    Vi prego aiutatemi! Non capisco perchè il padre non aspetta il secondo filglio!!!

    Se vi serve ho anche il codice (non fatto da me) che funziona correttamente, ma io non riesco a capire perchè il mio non funziona!!!

  2. #2
    Utente di HTML.it L'avatar di Ed_Bunker
    Registrato dal
    Jul 2003
    Messaggi
    1,119

    Re: la wait() di C

    Originariamente inviato da Swalke
    Ciao a tutti!
    Premetto che sono un principinante di C!

    Ho un problema nell'utilizzo della wait().
    Credo che la cosa sia dovuta al fatto che mi sfugge qualcosa sul comportamento della wait... ...ma non capisco cosa.
    L'esercizio che devo fare richiede quanto segue:

    1) Vi è un processo padre che crea un figlio con la fork()
    2) Il padre si mette in attesa del figlio tramite wait()
    3) Il figlio termina
    4) Il padre prosegue e crea un altro figlio con la fork
    5) Il padre invoca un'altra wait per attendere le fine di questo figlio.

    Ora vi riporto il mio codice che non riesco a capire perchè, non effettua l'attesa sul secondo figlio. Il programma è semplicissimo e oltre a creare i figli come detto sopra, fa solo delle stampe a video. (ho messo anche dei commentini per farvi sbattere il meno possibile)

    codice:
    #include <signal.h>
    #include <sys/types.h>
    #include <unistd.h>
    #include <stdio.h>
    
    int main()
    {
    	int id;	//variabili di servizio usate solo per recuperare
    	int id1;//gli ID dei processi per distinguere padre da iglio.
    
    	id=fork();
    	
    	if(id == 0)	//codice eseguido dal primo figlio.
    	{
    		id1=getpid();
    		printf("ID= %d - Io sono il primo figlio!\n", id1);
    		sleep(3);
    		printf("Primo figlio terminato\n");
    		exit(0); //Qui termina il primo figlio
    	}
    	
    	/*Codice eseguito solo dal padre*/	
    	id1=getpid();	//restituisce il proces id di chi lo invoca
    	printf("ID= %d - Io sono il padre!\n", id1);
    	printf("Attendo la fine del primo figlio!\n");
    	wait();	//mette in attesa della fine di un figlio.
    	
    	id=fork();
    
    	if(id == 0)	//codice eseguido dal secondo figlio.
    	{
    		id1=getpid();
    		printf("ID= %d - Io sono il secondo figlio!\n", id1);
    		sleep(3);
    		printf("Secondo figlio terminato\n");
    		exit(0);  //Qui termina il secondo figlio
    	}
    	
    	/*Codice eseguito solo dal padre*/
    	printf("ID= %d - Io sono il padre!\n", id1);
    	printf("Attendo la fine del secondo figlio!\n");
    	wait();	//mette in attesa della fine di un figlio.	
    	printf("Padre terminato, Fine dell'esercizio!\n");	
    	exit(0);
    }
    Se provate a farlo girare avrete che:
    1) Parte il padre e parte il primo figlio
    2) Il padre attende il primo figlio
    3) Il primo figlio termina
    4) Parte il secondo figlio
    5) Termina il padre
    6) Passati i 3 secondi della sleep termina il secondo figlio.

    Vi prego aiutatemi! Non capisco perchè il padre non aspetta il secondo filglio!!!

    Se vi serve ho anche il codice (non fatto da me) che funziona correttamente, ma io non riesco a capire perchè il mio non funziona!!!
    Perche' non provi a fare un controllo sulla wait ?
    Controllando il valore di ritorno sella wait saprai se c'e' un errore dovuto alla chiamata di sistema oppure se non c'e' gia' piu' nessun figlio di cui aspettare la terminazione.

  3. #3
    Il valore di ritorno della wait non è -1 quindi non da errore!
    Il figlio che deve ancora terminare c'è ed è il secondo (come dicevo appunto nel mio post).

  4. #4

  5. #5
    kentaro, nel post che mi hai linkato avevi messo un linc dove siaparla di un problema relativo alla pause che era possibile evirate usando la sleep al posto della pause.

    Io però uso già la sleep quindi non credo sia lo stesso problema...
    ...per rendere meglio l'idea ti posto l'output che mi salta fuori se eseguo il codice che ho postato...
    ...occhio anche alla stampa che viene fatta dopo al prompt!

    codice:
    ID= 3139 - Io sono il primo figlio! 
    ID= 3138 - Io sono il padre! 
    Attendo la fine del primo figlio! 
    Primo figlio terminato 
    ID= 3140 - Io sono il secondo figlio! 
    ID= 3138 - Io sono il padre! 
    Attendo la fine del secondo figlio! 
    Padre terminato, Fine dell'esercizio! 
    [swalke@localhost Desktop]$ Secondo figlio terminato
    Faccio notare che l'ultima stampa "secondo figlio terminato" avviene dopo l'exit(0) del padre, ecco perchè si trova dopo il prompt. Inoltre avviene dopo 3 secondi circa che è uscito il prompt, segno che il figlio era nella sleep di 3 secondi.

    Ergo... ...il padre non aspetta il secondo figlio!

    Vi prego aiutatemi!

  6. #6
    http://man.he.net/man2/wait

    If a child has already exited by the time of the call
    (a so-called "zombie" process), the function returns
    immediately

    cioe' se e' uscito un altro processo(come nel tuo caso)
    esce subito
    meglio se usi waitpid con il pid ottenuto da fork..

  7. #7
    OK!
    Grazie!!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.