BiRabittoh

Stringa condivisa fra tre processi

Jan 11th, 2018
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.56 KB | None | 0 0
  1.  /*
  2.  * ESERCIZIO CON SEMAFORI E SHARED MEMORY, DI MARCO ANDRONACO
  3.  * Vi siano tre processi P1 P2 P3. P1 deve leggere una stringa inserita da tastiera da parte dell'utente.
  4.  * P1 dopodichè mediante una memoria condivisa deve mandare la stringa ad u processo P2.
  5.  * La seconda stringa che riceve P1, dovrà essere inviata a P3.
  6.  * Il ciclo di invio è P2-P3. Se viene inviata la stringa EXIT a P1, questa deve essere mandata ad entrambi i processi P2 e P3.
  7.  * Con EXIT i processi devono chiudersi.
  8.  */
  9.  
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <unistd.h>
  13. #include <sys/types.h>
  14. #include <sys/ipc.h>
  15. #include <sys/shm.h>
  16. #include <string.h>
  17. #include <sys/sem.h>
  18.  
  19. #define BUF_SIZE 128
  20.  
  21. union semun { //va sempre inclusa per assicurare la portabilita' del codice
  22.     int val;
  23.     struct semid_ds *buf;
  24.     unsigned short *array;
  25. };
  26.  
  27.  
  28.  
  29. void * stringa = (void *)0;
  30.  
  31. int turno = 2;
  32.  
  33. //prototipi funzioni semafori
  34. int sem_down(int sem_id);
  35. int sem_up(int sem_id);
  36. int sem_set(int sem_id, int val);
  37.  
  38. int main(void){
  39.     pid_t P1, P2, P3;
  40.     int shmid;
  41.     int semid1, semid2, semid3;
  42.     int run = 1;
  43.    
  44.     shmid = shmget((key_t)1234, sizeof(stringa), 0666 | IPC_CREAT);
  45.     if (shmid == -1) {
  46.         puts("Errore nella shmget!!");
  47.         exit(EXIT_FAILURE);
  48.     }
  49.    
  50.     semid1 = semget((key_t)3333, 1, 0666 | IPC_CREAT);
  51.     semid2 = semget((key_t)4444, 1, 0666 | IPC_CREAT);
  52.     semid3 = semget((key_t)5555, 1, 0666 | IPC_CREAT);
  53.    
  54.    
  55.     sem_set(semid1, 1);
  56.     sem_set(semid2, 0);
  57.     sem_set(semid3, 0);
  58.    
  59.    
  60.     P1 = getpid();
  61.     P2 = fork();
  62.     switch(P2){
  63.         case -1:
  64.             puts("Errore nella prima fork!!");
  65.             exit(EXIT_FAILURE);
  66.         case 0: //INIZIO P2
  67.             P3 = fork();
  68.             switch(P3){
  69.                 case -1:
  70.                     puts("Errore nella seconda fork!!");
  71.                     exit(EXIT_FAILURE);
  72.                 case 0: //CODICE DI P3
  73.                     stringa = shmat(shmid, (void *)0, 0);
  74.                     do {
  75.                         sem_down(semid3);
  76.                         if (!strcmp("EXIT", stringa)){
  77.                             puts("P3: Ho letto exit, esco.");
  78.                             exit(EXIT_SUCCESS);
  79.                         }
  80.                         printf("\nP3: Hai scritto '%s'.\n", stringa);
  81.                         sem_up(semid1);
  82.                     } while (1);
  83.                 break;
  84.                 default: //CODICE DI P2
  85.                     stringa = shmat(shmid, (void *)0, 0);
  86.                     do {
  87.                         sem_down(semid2);
  88.                         if (!strcmp("EXIT", stringa)){
  89.                             puts("P2: Ho letto exit, esco.");
  90.                             exit(EXIT_SUCCESS);
  91.                         }
  92.                         printf("\nP2: Hai scritto '%s'.\n", stringa);
  93.                         sem_up(semid1);
  94.                     } while (1);
  95.                 break;
  96.             }
  97.         break;
  98.         default: //CODICE DI P1:
  99.             stringa = shmat(shmid, (void *)0, 0);
  100.             do {
  101.                 sem_down(semid1);
  102.                 printf("Ciao, inserisci la stringa da passare: ");
  103.                 scanf("%s", (void *)stringa);
  104.                
  105.                 if (!strcmp("EXIT", stringa)){
  106.                     //chiude P2 e P3: aggiungere questa parte dopo
  107.                     sem_up(semid2);
  108.                     sem_up(semid3);
  109.                    
  110.                     run = 0;
  111.                 } else {
  112.                     if(turno == 2){
  113.                         sem_up(semid2);
  114.                         turno = 3;
  115.                     } else if(turno == 3){
  116.                         sem_up(semid3);
  117.                         turno = 2;
  118.                     }
  119.                 }  
  120.             } while(run);
  121.             //detach e pulizia di memoria e semafori
  122.             shmdt(shmid);
  123.             shmctl(stringa, IPC_RMID, NULL);
  124.             semctl(semid1, 1, IPC_RMID);
  125.             semctl(semid2, 1, IPC_RMID);
  126.             semctl(semid3, 1, IPC_RMID);
  127.            
  128.   }
  129. }
  130.  
  131. int sem_down(int sem_id){
  132.     struct sembuf buf;
  133.     buf.sem_num = 0;
  134.     buf.sem_op = -1;
  135.     buf.sem_flg = SEM_UNDO;
  136.     semop(sem_id, &buf, 1);
  137. }
  138.  
  139. int sem_up(int sem_id){
  140.     struct sembuf buf;
  141.     buf.sem_num = 0;
  142.     buf.sem_op = 1;
  143.     buf.sem_flg = SEM_UNDO;
  144.     semop(sem_id, &buf, 1);
  145. }
  146.  
  147. int sem_set(int sem_id, int val){
  148.     union semun un;
  149.     un.val = val;
  150.     semctl(sem_id, 0, SETVAL, un);
  151. }
Add Comment
Please, Sign In to add comment