Advertisement
Guest User

Untitled

a guest
Feb 18th, 2019
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.38 KB | None | 0 0
  1. /*Implementare un programma che riceva in input tramite argv[2] un numero
  2. intero N maggiore o uguale ad 1 (espresso come una stringa di cifre
  3. decimali), e generi N nuovi processi. Ciascuno di questi leggera' in modo
  4. continuativo un valore intero da standard input, e lo comunichera' al
  5. processo padre tramite memoria condivisa. Il processo padre scrivera' ogni
  6. nuovo valore intero ricevuto su di un file, come sequenza di cifre decimali.
  7. I valori scritti su file devono essere separati dal carattere ' ' (blank).
  8. Il pathname del file di output deve essere comunicato all'applicazione
  9. tramite agv[1].
  10. Nel caso in cui non vi sia immissione in input, l'applicazione non deve
  11. consumare piu' del 5% della capacita' di lavoro della CPU.*/
  12.  
  13. #include <unistd.h>
  14. #include <errno.h>
  15. #include <signal.h>
  16. #include <pthread.h>
  17. #include <sys/types.h>
  18. #include <sys/ipc.h>
  19. #include <sys/sem.h>
  20. #include <sys/mman.h>
  21. #include <semaphore.h>
  22. #include <fcntl.h>
  23. #include <stdio.h>
  24. #include <stdlib.h>
  25. #include <string.h>
  26.  
  27. long N, i;
  28. sem_t* semP;            // parent sem
  29. sem_t* semC;            // child sem
  30. int* shrbuff;           // memoria condivisa
  31. int fd, rc;
  32. FILE* fp;
  33. pid_t pid;
  34. char* pathname;
  35. void handler(int sig);
  36. void childFunct(long childNum);
  37.  
  38. int main(int argc, char* argv[]){
  39.     // num process
  40.     N = strtol(argv[2],NULL,10);
  41.     if(argc < 3 || N < 1){
  42.         printf("Not enough arguments (%d/2 given) or argv[2] < 1 (it's %ld)",argc, N);
  43.         exit(-1);
  44.     } else {
  45.         // inizializzo memoria condivisa
  46.         shrbuff = mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS,0,0);
  47.         if(shrbuff == NULL){
  48.             printf("Error on mmap\n");
  49.             exit(-1);
  50.         }
  51.         // apro il file
  52.         strcpy(pathname, argv[1]);
  53.         fd = open(pathname, O_RDWR|O_CREAT|O_TRUNC, 0666);
  54.         if(fd == -1){
  55.             printf("Error on open\n");
  56.             exit(-1);
  57.         }
  58.         fp = fdopen(fd, "w+");
  59.         if(fp == NULL){
  60.             printf("fdopen error\n");
  61.             exit(-1);
  62.         }
  63.         printf("Opened file %s", pathname);
  64.         // inizializzo semafori
  65.         semP = mmap(NULL, sizeof(sem_t), PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS,0,0);
  66.         if(semP == NULL){
  67.             printf("mmap error\n");
  68.             exit(-1);
  69.         }
  70.         semC = mmap(NULL, N*sizeof(sem_t), PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS,0,0);
  71.         if(semC == NULL){
  72.             printf("mmap error\n");
  73.             exit(-1);
  74.         }
  75.         for(i = 0; i<N; i++){
  76.             rc = sem_init(&semC[i], 1, 0);
  77.             if(rc == -1){
  78.                 printf("sem_init error\n");
  79.                 exit(-1);
  80.             }
  81.         }
  82.         rc = sem_init(&semP[0], 1, (unsigned)N);
  83.         if(rc == -1){
  84.             printf("sem_init error\n");
  85.             exit(-1);
  86.         }
  87.         // segnali
  88.         signal(SIGINT, handler);
  89.         // spawn child
  90.         for(i = 0; i < N; i++){
  91.             pid = fork();
  92.             if(pid == 0){
  93.                 signal(SIGINT, SIG_IGN);
  94.                 childFunct(i);
  95.             }
  96.         }
  97.         while(1){
  98.             // prendo token da semP
  99.             for(i = 0; i<N; i++){
  100.                 rc = sem_wait(&semP[0]);
  101.                 if(rc == -1){
  102.                     printf("semP wait error\n");
  103.                     exit(-1);
  104.                 }
  105.             }
  106.             printf("Founded value is %d", *shrbuff);
  107.             fprintf(fp, "%d ", *shrbuff);
  108.             fflush(fp);
  109.             for(i = 0; i<N; i++){
  110.                 rc = sem_post(&semC[i]);
  111.                 if(rc == -1){
  112.                     printf("semP wait error\n");
  113.                     exit(-1);
  114.                 }
  115.             }
  116.         }
  117.     }
  118. }
  119.  
  120. void handler(int sig){
  121.     if(sig == SIGINT){
  122.         printf("\n\thandler activated\n");
  123.         char command[1024];
  124.         sprintf(command, "cat %s\n", pathname);
  125.         system(command);
  126.     }
  127. }
  128. void childFunct(long childNum){
  129.     //int val;
  130.     printf("child n.%ld born", childNum);
  131.  
  132.     while(1){
  133.         rc = sem_wait(&semC[childNum]);
  134.         if(rc == -1){
  135.             printf("semC wait error\n");
  136.             exit(-1);
  137.         }
  138.         sleep(1);
  139.         printf("child %ld is scanning - write value\n", childNum);
  140.         scanf("%d", *&shrbuff);
  141.         printf("inserted %d", *shrbuff);
  142.         rc = sem_post(&semP[0]);
  143.     }
  144. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement