/* Scrivere un programma C in cui un processo padre crea un file e genera N figli; Ogni figlio scrive sul file un numero casuale di byte e poi comunica al padre tramite exit() quanti byte ha scritto; Il padre aspetta tutti i figli e calcola quanti byte sono stati scritti in totale; Il padre confronta il valore calcolato con l'effettivo numero di byte nel file. */ #include #include #include main(int argc, char *argv[]){ int i,j, N; int pid, status; int fd, len; long int sum1, sum2; char buffer[10]; int mypid; /*Controllo sul numero di parametri*/ if (argc < 3){ printf("USO: %s N file\ngenera N processi figli che scrivono su \n\n", argv[0]); exit(1); } /*Recupero il numero dei processi*/ N = atoi(argv[1]); /* N deve essere strettamente positivo */ if (N <= 0) { printf("USO: %s N\ngenera N processi figli\n\n", argv[0]); exit(2); } printf("padre %d genera %d figli\n", getpid(), N); /*Creo il file*/ fd = creat(argv[2], 0644); if (fd < 0){ printf("Errore nella creazione del file %s\n", argv[2]); exit(3); } for (i=0; i < N; i++){ pid = fork(); /*creo i figli */ if (pid < 0){ printf("Errore nella fork\n\n"); exit(4); } if (pid == 0){ /*figlio*/ printf("figlio %d del padre %d\n", getpid(), getppid()); /*Codice del figlio*/ mypid = getpid(); srand(mypid); /* calcoliamo un numero random di volte che scrivere la stessa stringa sul file */ len = (rand()%10)+1; /* costruiamo una stringa con il pid del figlio */ sprintf(buffer,"(%d)\n",mypid); /* NOTA BENE: tutti i figli condividono lo stesso I/O pointer per il file */ for(j=0; j>8 & 0xFF)); sum1 = sum1 + (status >> 8 & 0xFF); } printf("Byte totali scritti: %ld\n", sum1); sum2 = lseek(fd, 0L, SEEK_END); /* va alla fine del file */ printf("Il file contiene %ld byte\n", sum2); if (sum1 == sum2) printf("I due calcoli coincidono ;-)\n"); else printf("I due calcoli NON coincidono ;-(\n"); close(fd); }