[C]esercizio processi paralleli -- [RISOLTO]

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
margiane
Prode Principiante
Messaggi: 5
Iscrizione: lunedì 7 giugno 2010, 17:18

[C]esercizio processi paralleli -- [RISOLTO]

Messaggio da margiane »

ciao a tutti, sto facendo degli esercizi per fare un po di pratica sui processi paralleli, senza utilizzo di wait(), ma solo sleep().

ne ho fatto uno utilizzando 5 processi paralleli, dove in ogni processo creato stampo di volta in volta sono il padre, il mio pid è...sono il figlio ecc...fino ai nipoti...
il codice è questo e funziona...

Codice: Seleziona tutto

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>

int main(void){


	pid_t pid;
  	printf("\nSono il padre.Il mio PID e' %d\n", getpid());
	
	switch(pid=fork()){
		case -1:
				printf("errore nella fork");
				break;
		case 0:
				sleep(2);
    			printf("\nsono il primo figlio. il mio PID e' %d. il PPID di mio padre e' %d.Adesso faccio un figlio anche io\n", getpid(), getppid());
				sleep(10);
							switch(pid=fork()){
									case -1:
											printf("errore nella fork");
											break;
									case 0: 
											sleep(2);
											printf("\nsono il secondo nipote. il mio PID e' %d. il PPID di mio padre e' %d.\n", getpid(), getppid());
											break;
									default:
											sleep(4);
											printf("\nSono il primo figlio(%d).Ora esco.\n", getpid());
											_exit(0);
							}				
				
				break;
		default:
					
				sleep(4);			
				printf("\nsono il padre(%d).Ho gia partorito 1 figlio e ora faccio il secondo.\n\n", getpid());
				
				switch(pid=fork()){
					case -1:
							printf("errore nella fork");
							break;
					case 0:
							sleep(2);
    						printf("\nsono il secondo figlio. il mio PID e' %d. il PPID di mio padre e' %d.Adesso faccio un figlio anche io\n", getpid(), getppid());
		
							switch(pid=fork()){
									case -1:
											printf("errore nella fork");
											break;
									case 0:
											sleep(4);
											printf("\nsono il primo nipote. il mio PID e' %d. il PPID di mio padre e' %d.\n", getpid(), getppid());
											break;
									default:
											sleep(6);
											printf("\nSono il secondo figlio(%d).Ora esco.\n", getpid());
											_exit(0);
							}				
								break;

					default:
							sleep(4);
							printf("\nsono il padre(%d).Ho partorito 1 altro figlio e ora sono stufo.\n\n", getpid());
							sleep(12);
				}
				_exit(0);
	}

}
nell'esercizio successivo devo aggiungere un altro livello con 2 processi(pronipoti), pero quando entra nel processo relativo al primo pronipote, non esegue la printf, mentre il processo relativo al secondo pronipote viene eseguito correttamente..la temporizzazione dovrebbe essere corretta...credo...ecco il codice:

Codice: Seleziona tutto

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>

int main(void){


	pid_t pid;
  	printf("\nSono il padre.Il mio PID e' %d\n", getpid());
	
	switch(pid=fork()){
		case -1:
				printf("errore nella fork");
				break;
		case 0:
				sleep(2);
    			printf("\nsono il primo figlio. il mio PID e' %d. il PPID di mio padre e' %d.Adesso faccio un figlio anche io\n", getpid(), getppid());
				sleep(10);
							switch(pid=fork()){
									case -1:
											printf("errore nella fork");
											break;
									case 0: 
											sleep(6);
											printf("\nsono il secondo nipote. il mio PID e' %d. il PPID di mio padre e' %d.\n", getpid(), getppid());
											break;
									default:
											sleep(8);
											printf("\nSono il primo figlio(%d).Ora esco.\n", getpid());
											_exit(0);
							}				
				
				break;
		default:
					
				sleep(4);			
				printf("\nsono il padre(%d).Ho gia partorito 1 figlio e ora faccio il secondo.\n\n", getpid());
				
				switch(pid=fork()){
					case -1:
							printf("errore nella fork");
							break;
					case 0:
							sleep(2);
    						printf("\nsono il secondo figlio. il mio PID e' %d. il PPID di mio padre e' %d.Adesso faccio un figlio anche io\n", getpid(), getppid());
							switch(pid=fork()){
									case -1:
											printf("errore nella fork");
											break;
									case 0:
											sleep(4);
											printf("\nsono il primo nipote. il mio PID e' %d. il PPID di mio padre e' %d.\n", getpid(), getppid());
											switch(pid=fork()){
													case -1:
															printf("errore nella fork");
															break;
													case 0:
															sleep(2);
															printf("\nsono il primo pronipote.il mio PID e' %d. il PPID di mio padre e' %d.", getpid(), getppid());	
															break;
													default:
															sleep(4);
															printf("\nsono il primo nipote(%d). Ora esco", getpid());
															_exit(0);
											}											
											break;
									default:
											sleep(10);
											printf("\nSono il secondo figlio(%d).Ora esco.\n", getpid());
											_exit(0);
							}				
								break;

					default:
							sleep(4);
							printf("\nsono il padre(%d).Ho partorito 1 altro figlio e ora sono stufo.\n\n", getpid());
							sleep(12);
				}
				_exit(0);
	}
}
se non risolvo questo grattacapo non posso andare avanti con lo studio  ::)
Ultima modifica di margiane il venerdì 25 giugno 2010, 17:49, modificato 1 volta in totale.
Avatar utente
mr.chaka
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 742
Iscrizione: martedì 29 settembre 2009, 22:23
Località: Barcelona

Re: [C]esercizio processi paralleli

Messaggio da mr.chaka »

senza utilizzo di wait(), ma solo sleep()
Ma sono 2 funzioni differenti.. Cmq ti sconsiglio di usare la sleep().. E cmq io farei con gli if qualcosa di questo tipo.. Ben implementati non hanno bisogno della wait(), per lo meno in una semplice e elementare implementazione del genere..

Codice: Seleziona tutto

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main()
{
   pid_t pid = getpid();
   
   printf("Padre = %d\n", pid);
   
   if(( pid=fork() ) == 0)
   {

      printf("Figlio = %d, Padre = %d\n", getpid(), getppid());  
   
      if(( pid=fork() ) == 0)
      {
         printf("Nipote =  %d, Padre = %d\n", getpid(), getppid());
         if(( pid=fork() ) == 0)
         {
            printf("Pronipote =  %d, Padre = %d\n", getpid(), getppid());
            exit(0);
         }         
         exit(0);
      }      
      exit(0);
   }
   
   return 0;
}
Nel tuo ultimo codice non usare la _exit(0) ma la exit(0) da stdlib.h, ed ho tolto la sleep() alla linea 71.. Senno andava in "deadlock"..
margiane
Prode Principiante
Messaggi: 5
Iscrizione: lunedì 7 giugno 2010, 17:18

Re: [C]esercizio processi paralleli

Messaggio da margiane »

ho risolto usando la exit di stdlib  ;D
grazie mille...
;D
Ultima modifica di margiane il venerdì 25 giugno 2010, 17:49, modificato 1 volta in totale.
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 3 ospiti