Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    programmazione fork

    avrei un problema da risolvere.devo svolgere questo esercizio

    Implementare il seguente problema: Un processo padre genera un processo figlio e un processo fratello.
    Il figlio a sua volta genera un processo nipote.
    Ciascun processo stampa a schermo il proprio pid e il pid del processo che l'ha generato
    e si mette in attesa della morte del figlio (qualora ne abbia)

    io inizio impostando il primo pezzo di esercizio

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    
    int main (int argc, char *argv[])
    {
    	pid_t child_pid[1]; //Pid Figli
    	pid_t nephew_pid[1]; //Pid Nipoti generati dai figli
    	int i,stat_val;
    	
    	printf("Inizio programma\n");
    	
    	printf("Main Process PID= %d\n", (int) getpid());
    	
    	for (i=0; i<2; i++) // durante il secondo ciclo la fork viene eseguita sia dal processo padre sia dal processo figlio creato tramite il primo ciclo creando così 3 processi
    	{
    		child_pid[i]=fork();
    		
    		if(child_pid<0)
    			perror("chiamata a fork fallita\n");
    		else if(child_pid[i]!=0) // Mi trovo nel contesto del padre
    			printf("Figlio: PID=[%d] generato dal Padre: PID[%d]\n", child_pid[i], (int) getpid());	
    	}
    	
    
    	for(i=0; i<2; i++){
    	if(child_pid[i]!=0){
    		pid_t child_pid=wait(&stat_val);
    	}
    	}
    }
    purtroppo come risultato ottengo tre processi figli anziché due.questo perché durante il secondo ciclo il processo forka il padre ed il primo processo figlio creato in precedenza.ottenendo così quattro processi: il processo padre.due processi figli ed un processo nipote del primo processo figlio creato.

    io vorrei invece ottenere solamente due processi figli e basta.chi mi può aiutare?

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Perché fai un ciclio? Ti basta fare una sequenza opportuna di if-then-else che controlli i valori dei pid man mano che i processi vengano creati, ricordando che la fork() restituisce due volte: 0 nel processo figlio, un valore diverso da 0 nel processo padre (che è il pid del figlio), salvo errori.

    In ogni caso fai attenzione che stai dichiarando array di un solo elemento ma poi ne utilizzi due, senza contare che il primo if all'interno del primo for ha una condizione di controllo su child_pid che è solo l'indirizzo base dell'array, non il primo elemento.
    every day above ground is a good one

  3. #3
    Originariamente inviato da YuYevon
    Perché fai un ciclio? Ti basta fare una sequenza opportuna di if-then-else che controlli i valori dei pid man mano che i processi vengano creati, ricordando che la fork() restituisce due volte: 0 nel processo figlio, un valore diverso da 0 nel processo padre (che è il pid del figlio), salvo errori.

    In ogni caso fai attenzione che stai dichiarando array di un solo elemento ma poi ne utilizzi due, senza contare che il primo if all'interno del primo for ha una condizione di controllo su child_pid che è solo l'indirizzo base dell'array, non il primo elemento.
    be utilizzo il ciclo for proprio per evitare di ripetere la creazione il codice fork 4 volte in tutto il programma.senza for devo riscrivere la fork più volte.be il primo if all'interno del primo for è una mia dimenticanza.ho sbagliato.

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.