#include #include #include #include #include #include typedef int pipe_t[2]; int main(int argc, char *argv[]) { int N, i, j, nread, nwrite, fdr, fdw, status, ritorno, pid, pidFiglio; long int cont; /* per il conteggio della dimensione del file creato */ pipe_t *p; /* array dinamico di pipe per la sincronizzazione fra padre e figli */ char *nomefile, blocco[512]; /* nome file array dinamico di caratteri per contenere il nome del file; blocco variabile che serve ai figli per leggere il file */ char ch; /* carattere mandsto dal padre sulle pipe ai figli, il cui valore non e' importante */ if (argc != 3) { printf("Errore nel numero dei parametri\n"); exit(1); } N = atoi(argv[2]); if (N < 0) /* N deve essere positivo */ { printf("Errore non numero positivo\n"); exit(2); } if ((nomefile = (char *)(malloc(strlen(argv[1])+5))) == 0) { printf("Errore nella allocazione per nomefile\n"); exit(3); } strcpy(nomefile, argv[1]); strcat(nomefile, ".sig"); if ((fdw = open(nomefile, O_RDONLY)) >= 0) { printf("Il file %s esiste gia'\n", nomefile); exit(4); } if ((fdw = creat(nomefile, 0644)) < 0) { printf("Errore nella creazione del file %s\n", nomefile); exit(5); } if ((p = (pipe_t*)malloc((N+1)*sizeof(pipe_t))) == 0) { printf("Errore nella allocazione per pipe\n"); exit(6); } for (i = 0; i < (N+1); i++) { if (pipe(p[i]) < 0) { printf("Errore nella creazione della pipe\n"); exit(7); } /* diversamente da altre soluzioni, in questa si e' usato un solo for per creare le pipe e contestualmente creare i processi figli */ if ((pid = fork()) < 0) { printf("Errore nella fork %d\n", i); exit(8); } if (pid==0) /* figlio */ { printf("Figlio %d con pid %d\n", i, getpid()); /* chiude tutte le pipe che non usa */ for (j = 0; j <= i; j++) { /* si deve arrivare fino a i perche' le altre pipe non sono ancora create. Questo deirva dall'aver usato un solo for per la creazione di pipe e figli! */ close(p[j][1]); if (j != i) close(p[j][0]); } if ((fdr = open(argv[1], O_RDONLY)) < 0) { printf("Errore nella apertura del file %s\n", argv[i]); exit(9); } lseek(fdr, (i*512), 0); nread = read(fdr, blocco, 512); for (j=0; j> 8) & 0xFF); printf("Il figlio con pid=%d ha ritornato %d\n", pidFiglio, ritorno); } } cont = lseek(fdw, 0L, 2); printf("Numero caratteri scritti su %s: %ld\n", nomefile, cont); exit(0); }