/* * Genera N processi figli poi e attende che il figlio M-esimo sia terminato */ #include #include main(int argc, char *argv[]){ int i, N, M, time; int pid, status, apid; /*Controllo il numero di parametri*/ if (argc < 3){ printf("USO: %s N M\ngenera N processi figli e aspetta l'M-esimo\n\n", argv[0]); exit(1); } N = atoi(argv[1]); /*Il numero dei processi da generare*/ /* N deve essere strettamente positivo */ if (N <= 0) { printf("USO: %s N\ngenera N processi figli\n\n", argv[0]); exit(2); } M = atoi(argv[2]); /*L'indice del processo da attendere*/ if (N < M){ printf("Errore: il secondo parametro deve essere <= del primo\n\n"); exit(3); } printf("Padre %d genera %d figli e aspetta il %d-esimo\n", getpid(), N, M); for (i=0; i < N; i++){ if ((pid = fork()) < 0){ printf("Errore nella fork\n\n"); exit(4); } if (pid == 0){ /* il figlio */ srand(getpid()); time = (rand() % 10) + 1; sleep(time); printf("figlio %d del padre %d\n", getpid(), getppid()); exit(i); /* esce dal ciclo */ } else{ /* padre */ if ((i+1) == M){ /* se e' stato generato l'M-esimo processo */ apid = pid; /* deve essere aspettato */ } } } /* padre */ printf("generati %d figli\n", N); sleep(3); pid = 0; while ( (pid != apid) && (pid >= 0) ){ /* finche' non recupero il processo con PID = apid */ pid = wait(&status); printf("il figlio %d ha terminato con stato %d\n", pid, (status>>8 & 0xFF)); } }