/* soluzione parte C esame del 19 Gennaio 2022: la comunicazione in ogni coppia va dal primo processo della coppia al secondo processo della coppia ed e' il secondo processo della coppia deve creare il file con terminazione ".mescolato" sul quale poi deve scrivere */ #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! */ /* N nome specificato nel testo */ int C; /* numero intero positivo dispari */ int pid; /* variabile per fork */ pipe_t *pipe_ps; /* array di pipe per la comunicazione dai figli primi della coppia ai figli secondi della coppia */ int fd; /* variabile per open */ char *FCreato; /* variabile per nome file da creare da parte dei processi figli primi della coppia */ int fcreato; /* variabile per creat */ /* fcreato nome specificato nel testo */ char *b; /* variabile per leggere dai figli */ /* b nome specificato nel testo */ int nroTotale; /* variabile per tenere traccia del numero di blocchi presenti nei file */ int nro; /* variabile per tenere traccia del numero di blocchi leti dalla propria meta' del file */ /* nro nome specificato nel testo */ int status, pidFiglio, ritorno; /* per wait */ int i, j; /* indici per cicli */ /* i nome specificato nel testo */ int nr, nw; /* per controllo su read/write */ /* Controllo sul numero di parametri: N deve essere maggiore o uguale a 1 */ if (argc < 3) { printf("Errore numero parametri dati che argc=%d\n", argc); exit(1); } /* controllo sull'ultimo parametro: numero dispari C */ C = atoi(argv[argc-1]); if ( (C <= 0) || (C % 2 == 0) ) { printf("Errore numero C %s\n", argv[argc-1]); exit(2); } /* calcoliamo il numero dei file */ N = argc - 2; printf("DEBUG-Numero processi da creare %d con C=%d\n", 2*N, C); /* allocazione memoria dinamica per buffer */ b=(char *)malloc(C*sizeof(char)); if (b == NULL) { printf("Errore nella malloc per buffer b\n"); exit(3); } /* allocazione memoria dinamica per pipe_ps. NOTA BENE: servono un numero di pipe che e' la meta' del numero di figli! */ pipe_ps=(pipe_t *)malloc(N*sizeof(pipe_t)); if (pipe_ps == NULL) { printf("Errore nella malloc per le pipe\n"); exit(4); } /* creazione delle pipe: ATTENZIONE VANNO CREATE solo N pipe */ for (i=0; i < N; i++) { if (pipe(pipe_ps[i])!=0) { printf("Errore creazione delle pipe\n"); exit(5); } } /* creazione dei processi figli: ne devono essere creati 2*N */ for (i=0; i < 2*N; i++) { pid=fork(); if (pid < 0) /* errore */ { printf("Errore nella fork con indice %d\n", i); exit(6); } if (pid == 0) { /* codice del figlio: in caso di errore torniamo 0 che non e' un valore accettabile (per quanto risulta dalla specifica della parte shell) */ if (i < N) /* siamo nel codice dei figli primi della coppia */ { /* stampa di debugging */ printf("DEBUG-PRIMO DELLA COPPIA-Figlio di indice %d e pid %d associato al file %s\n",i,getpid(),argv[i+1]); /* chiudiamo le pipe che non servono */ /* ogni figlio PRIMO della coppia scrive solo sulla pipe_ps[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 */