/* soluzione parte C esame dell'11 Settembre 2019: questa soluzione considera che la comunicazione in ogni coppia sia dal processo pari al processo dispari e che il processo dispari deve creare il file con terminazione ".MAGGIORE" */ #include #include #include #include #include #include #include #include #define PERM 0644 typedef int pipe_t[2]; /* tipo di dato per contenere i file descriptors di una pipe */ int main(int argc, char **argv) { int N; /* numero di file: i processi figli saranno il doppio! */ int pid; /* variabile per fork */ pipe_t *pipe_f; /* array di pipe per la comunicazione dai figli pari e figli dispari */ int fd; /* variabile per open */ char *Fcreato; /* variabile per nome file da creare da parte dei processi dispari */ int fdw; /* variabile per creat */ char ch; /* variabile per leggere dai figli */ char ch1; /* variabile per ricevere dal processo-coppia */ int letti; /* variabile per tenere traccia del numero di caratteri letti */ int status, pidFiglio, ritorno; /* per wait */ int i, j; /* indici per cicli */ int nr, nw; /* per controlli read e write su/da pipe */ /* Controllo sul numero di parametri */ if ( (argc < 3) && (argc - 1) % 2 !=0) { printf("Errore numero parametri %d\n", argc); exit(1); } /* calcoliamo il numero dei file */ N = argc - 1; printf("Numero processi da creare %d\n", N); /* allocazione memoria dinamica per pipe_fi. NOTA BENE: servono un numero di pipe che e' la meta' del numero di figli! */ pipe_f=malloc(N/2*sizeof(pipe_t)); if (pipe_f == NULL) { printf("Errore nelle malloc\n"); exit(2); } /* creazione delle pipe: ATTENZIONE VANNO CREATE N/2 pipe */ for (i=0; i < N/2; i++) { if (pipe(pipe_f[i])!=0) { printf("Errore creazione delle pipe\n"); exit(3); } } /* creazione dei processi figli: ne devono essere creati N */ for (i=0; i < N; i++) { pid=fork(); if (pid < 0) /* errore */ { printf("Errore nella fork con indice %d\n", i); exit(4); } if (pid == 0) { /* codice del figlio */ /* stampa di debugging */ printf("Figlio di indice %d e pid %d associato al file %s\n",i,getpid(),argv[i+1]); /* ogni figlio deve aprire il suo file associato */ fd=open(argv[i+1], O_RDONLY); if (fd < 0) { printf("Impossibile aprire il file %s\n", argv[i+1]); exit(0); /* in caso di errore torniamo 0 che non e' un valore accettabile (per quanto risulta dalla specifica della parte shell) */ } /* inizializziamo letti */ letti=0; if (i % 2 == 0) /* siamo nel codice dei figli pari */ { /* chiudiamo le pipe che non servono */ /* ogni figlio pari scrive solo su pipe_f[i] */ for (j=0;j> 8) & 0xFF); printf("Il figlio con pid=%d ha ritornato %d (se 0 problemi!)\n", pidFiglio, ritorno); } } exit(0); }/* fine del main */