Processo padre e figli

di il
4 risposte

Processo padre e figli

Salve a tutti!
Tra qualche giorno ho un esame di Sistemi Operativi e facendo esercizi in preparazione mi è capitato il seguente:

Un processo padre deve creare un figlio ed attendere la terminazione del figlio.
Il processo figlio deve creare un figlio ed attendere la terminazione del proprio figlio.
Ciascun processo figlio deve creare un figlio e attendere la terminazione di quel figlio.
Quando viene creato, in totale, il DECIMO processo figlio, quel processo figlio termina
senza creare nessun figlio e restituisce 1.
Ciascun processo, ad eccezione del DECIMO figlio, termina restituendo come exit code
il valore restituito dal suo figlio, incrementato di 1.

Non so proprio come cominciare, cioè come faccio a far fare una fork al processo figlio?
Perchè con un processo padre e un figlio riesco a gestirmi, ma così no...
Grazie per l aiuto!

4 Risposte

  • Re: Processo padre e figli

    MattiaP ha scritto:


    Salve a tutti!
    Non so proprio come cominciare, cioè come faccio a far fare una fork al processo figlio?
    Richiami semplicemente la fork() nel ramo di codice del programma specifico del processo figlio, quindi per intenderci quello che tipicamente va sotto la condizione "pid == 0", essendo "pid" il valore di ritorno della prima fork() che crea il primo processo figlio
    
    #include <unistd.h>
    #include <sys/types.h>
    
    int main(void)
    {
        pid_t pid;
        
        pid = fork();
        if (pid == 0) { /* processo figlio */
            /* istruzioni */
            pid = fork();
            if (pid == 0) { /* processo figlio del figlio */
                /* istruzioni */
            } else { /* processo figlio */
                /* istruzioni */
            }
        } else { /* processo padre */
            /* istruzioni */
        }
        
        return 0;
    }
    
  • Re: Processo padre e figli

    Grazie per la risposta!!!
    Una domanda sorge spontanea, non è possibile farlo con un ciclo oppure ricorsivamente??
  • Re: Processo padre e figli

    Certo che è possibile in entrambi i casi, ma sono piuttosto simili (fork funziona in sostanza come una chiamata ricorsiva), ma scegli se devi complicarti la vita
  • Re: Processo padre e figli

    
    #define MAX_FIGLI 10	
    int ex = 1;
    int esegui (int nFigli) {
    
    	int ret;
    	pid_t pid;
    	pid = fork();
    	nFigli++;
    	 if(nFigli == MAX_FIGLI)
    	 	exit(1);
    	
    	if(pid == 0){
    		printf("figlio %d \n",nFigli);
    		esegui(nFigli++);
    		 	 
    	}
    	else {
    	
    		    pid_t attesa;
    			int stato;
    		do 
    		{
    			/*printf("Prova2:%d\n",i);*/
    			attesa = waitpid(pid, &stato, 0);
    					
    		}while(attesa < 0);
    		
    		if(WIFEXITED(stato)) {
    			ret = WIFEXITED(stato);
    			printf("il figlio %d termina con %d \n",nFigli, ret);
    	}
    		
    	}
    	return 0;
    }
    
    int main(int argc, char *argv[]) {
    		
    	esegui(0);
    	return 0;
    }
    
    OK penso di esserci quasi riuscito ricorsivamente, unica cosa che non riesco a gestire è il valore di exit dal primo figlio in poi...
    L'esecuzione mi stampa questo:
    figlio 1
    figlio 2
    figlio 3
    figlio 4
    figlio 5
    figlio 6
    figlio 7
    figlio 8
    figlio 9
    il figlio 9 termina con 1
    il figlio 8 termina con 1
    il figlio 7 termina con 1
    il figlio 6 termina con 1
    il figlio 5 termina con 1
    il figlio 4 termina con 1
    il figlio 3 termina con 1
    il figlio 2 termina con 1
    il figlio 1 termina con 1

    Probabilmente è una cavolata ma non riesco a venirne fuori
Devi accedere o registrarti per scrivere nel forum
4 risposte