Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <unistd.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <signal.h>
- #include <sys/types.h>
- #include <sys/wait.h>
- #define NMAX 100
- /*
- ./prova1 N
- N figli
- numero random per ogni figlio generato dal padre(1-100), passato per pipe , univoco
- padre in attesa, intanto i figli generano un altro numero random (1-100) e lo sommano al numero passato dal padre
- dopo aver ricevuto tutto, il padre invoca SIGUSR1 per stampare tutto e controllare se ci sono stati numeri uguali.
- */
- int arr[NMAX];
- void handler(int signo){
- static int i = 0;
- //int n = argv[1];
- int n = NMAX;
- printf("il processo %d ha terminato con numero %d", getpid(), arr[i]);
- i++;
- if ( i == n) {
- for (int a = 0; a < n; a++){
- for (int b = 0; b < n; b++){
- if (arr[a] == arr[b]){
- printf("%d è ripetuto", arr[b]);
- }
- }
- }
- }
- }
- int main(int argc, char *argv[]){
- signal(SIGUSR1, handler);
- //controllo l'uso del comando
- if (argc != 2) {
- fprintf(stderr,"uso %s N", argv[0]);
- exit(1);
- }
- int pid, status;
- int n = atoi(argv[1]);
- int pipe_in[2], pipe_out[2];
- if (pipe(pipe_in) < 0){
- perror("errore pipe_in");
- exit(2);
- }
- if (pipe(pipe_out) < 0){
- perror("errore pipe_out");
- exit(3);
- }
- //creo N processi figli
- for (int i = 0; i < n; i++){
- if ((pid = fork() == 0)){
- //chiudo le pipe non necessarie
- int randint_p;
- close(pipe_in[1]);
- close(pipe_out[0]);
- read(pipe_in[0], &randint_p, sizeof(int));
- int randint = (rand() % NMAX) + 1 + randint_p;
- write(pipe_out[1], &randint_p, sizeof(int));
- exit(0);
- } else if (pid < 0){
- perror("nigga!\n");
- exit(1);
- }
- }
- int i = 0;
- while( (pid = waitpid(-1, &status, 0)) > 0){
- printf("nigga");
- int randint_p = (rand() % 100) + 1;
- int randint;
- write(pipe_in[1], &randint_p, sizeof(int));
- if (WIFEXITED(status)){
- read(pipe_out[0], &randint, sizeof(int));
- arr[i] = randint;
- i++;
- kill(pid, SIGUSR1);
- } else {
- printf("il figlio %d non ha terminato correttamente", pid);
- exit(4);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement