Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    9

    [C] Domanda sulla funzione wait()

    Salve a tutti, è la prima volta che scrivo in questo forum anche se seguo da molti anni il sito.

    Avrei gentilmente bisogno, abbastanza urgentemente poichè domani ho un esame, di un aiuto su un esercizio.

    Devo stabilire l'output di un programma e dire se quell'output è l'unico possibile.
    La mia domanda è: il wait() aspetta che una diramazione QUALSIASI del figlio finisca oppure aspetta necessariamente figlio->figlio, non facendo fare altro al figlio->padre?

    In pratica il programma stampa, nelle varie prove che ho fatto:
    1 2 3 4 4 3 4
    oppure (non sul mio pc, ma su quello di un amico)
    1 2 3 4 3 4 4

    Quello che cercavo di dire prima è se è possibile che il programma stampi
    1 2 3 3 4 4 4, ovvero può il processo figlio->padre stampare il 3 prima che il processo figlio->figlio finisca?


    Il programma che mi ha fatto sorgere il dubbio è il seguente:

    codice:
    #include <stdio.h> 
    #include <unistd.h> 
    int main() 
    { 	
          printf ("1\n"); 	
          if (fork()==0) 
           { 		
                  printf ("2\n"); 		
                  fork(); 		
                  printf ("3\n"); 	
            }else 		
                   wait(); 	 	
            printf ("4\n"); 
    }
    Ringrazio già in anticipo chiunque mi risponderà!
    Ciao!

  2. #2
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    93
    Ciao,

    non ho capito bene cosa intendi...ma comunque:

    Tre domande

    1) Quel codice non è che ad un certo punto ti si blocca?
    2) Uno di voi due ha un 64 bit?
    3) L'output "1 2 3 3 4 4 4" (della domanda) ti è mai uscito?

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    9
    1) No non si blocca, stampa 1 2 3 4 4 3 4 sul mio...
    2)Non credo, era su un pc dell'università, io non l'ho visto di persona quell'output. Posso assicurarti solo su 1 2 3 4 4 3 4 che esce sempre a me.
    3)Non non mi è mai uscito quello.

    In pratica quello che vorrei sapere è se può uscire 1 2 3 3 4 4 4 dal codice che ho postato. Quindi se può venire stampato 1 2 3(figlio->figlio) 3 (figlio->padre) 4 4 4...
    Oppure se la wait() "impone" la stampa del ramo figlio->figlio senza interferenze.
    Grazie!

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    9
    Chiedo scusa per i due messaggi consecutivi ma non posso editare.

    In altre parole ancora, vorrei sapere se la wait agisce anche sul processo figlio->padre

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    93
    Ti tico siò che so ma vorrei che qualcuno confermasse:

    la wait ritorna quando un figlio termina. Non aspetta che il figlio del figlio termini.
    Il gilio puo terminare, la wait ritorna, il padre finisce, il figlio del figlio inizia l'esecuzione

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    9
    Io graficamente lo vedo così, e quello che mi aspetto è che stampi 1 poi 2 poi il3 del figlio2 e poi il 4, infine si sblocca la wait e può stampare il resto...



    Uploaded with ImageShack.us

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    93
    Io credo che nessuno vieti alle scheduler del sistema operativo di interrompere il primo figlio dopo il 3 a favore di so figlio (cioè del figlio del figlio)...dopo una fork non è assicurato che sia il padre (o il figlio) ad andare in esecuzione...

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    9
    Quindi secondo te è fattibile 1 2 3 3 4 4 4?

  9. #9
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    93
    Prova a far girare questo e vedi se arrivi alle mie stesse conclusioni:
    codice:
    #include <stdio.h> 
    #include <unistd.h> 
    #include <sys/wait.h>
    int main() 
    { 
          int i, count=0;
          pid_t pid;
          printf ("Padre %d: 1\n",getpid());
          fflush(stdout);
          if(fork()==0) 
           { 		
                  printf ("Figlio1 %d: 2\n",getpid()); 
    	      fflush(stdout);
                  if((pid=fork())!=0)
    	      {
    		for(i=0;i<4E8;i++)
    		  count+=i*i;
    	      }
    		
                  printf ("Sono %d: 3\n",getpid()); 
    	      fflush(stdout);
    	      
    	      if(pid==0)
    	      {
    		for(i=0;i<4E8;i++)
    		  count+=i*i;
    	      }
            }
            else
    	  wait(NULL); 
    	
            printf ("Sono %d: 4\n",getpid()); 
    	fflush(stdout);
    	
    	return 0;
    }

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    9
    Ho provato a compilarlo ma non riesco, non capisco dove c'è qualcosa che non va... io sono su ubuntu.

    dice:

    /usr/lib/gcc/i686-linux-gnu/4.4.5/../../../../lib/crt1.o: In function `_start':
    (.text+0x18): undefined reference to `main'
    collect2: ld returned 1 exit status
    make: *** [forum] Errore 1


    Comunque nell'esame di info1 io avrò solo wait e fork...

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.