Advertisement
Guest User

Untitled

a guest
Dec 19th, 2016
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5. #include <sys/sem.h>
  6. #include <wait.h>
  7. #include <signal.h>
  8. #include <sys/shm.h>
  9.  
  10. #define KEY_WRITE 857694
  11. #define KEY_READ 986531
  12. #define KEY_MEMORY 957684
  13.  
  14. int sem_del(int semid);
  15. int sem_set(int semid, int value);
  16. int sem_up(int semid);
  17. int sem_down(int semid);
  18.  
  19. union semun
  20. {
  21.     int val;
  22.     struct semid_ds *buf;
  23.     unsigned short *array;
  24. };
  25.  
  26. struct s_m
  27. {
  28.     int written;
  29.     char message[256];
  30. };
  31.  
  32. int main()
  33. {
  34.     int sem_write, sem_read;
  35.     int shmid;
  36.     void *shared_address;
  37.     struct s_m *shared_memory;
  38.     sem_write = semget((key_t) KEY_WRITE, 1, 0666 | IPC_CREAT);
  39.     sem_read = semget((key_t) KEY_READ, 1, 0666 | IPC_CREAT);
  40.     shmid = shmget((key_t) KEY_MEMORY, sizeof(struct s_m), 0666 | IPC_CREAT);
  41.     sem_set(sem_write, 1);
  42.     sem_set(sem_read, 0);
  43.     pid_t pid = fork();
  44.     switch(pid)
  45.     {
  46.         case -1:
  47.             printf("Errore fork.\n");
  48.             exit(EXIT_FAILURE);
  49.         case 0: // Figlio
  50.             sem_write = semget((key_t) KEY_WRITE, 1, 0666 | IPC_CREAT);
  51.             sem_read = semget((key_t) KEY_READ, 1, 0666 | IPC_CREAT);
  52.             shmid = shmget((key_t) KEY_MEMORY, sizeof(shared_memory), 0666 | IPC_CREAT);
  53.             shared_memory = (struct s_m *)shmat(shmid, (void *) 0, 0);
  54.             printf("[FIGLIO] Ciao, sono stato avviato. Accedo alla regione critica ...\n");          
  55.             sem_down(sem_write);
  56.             int i = 0;
  57.             while(i < 10)
  58.             {
  59.                 sprintf(shared_memory->message, "[%d] MSG", i);
  60.                 i ++;
  61.                 sem_up(sem_read);
  62.                 sem_down(sem_write);
  63.             }
  64.             sprintf(shared_memory->message, "end");
  65.             sem_up(sem_read);
  66.             printf("[FIGLIO] Ho terminato le mie operazioni.\n");
  67.             break;
  68.         default: // Padre
  69.             shared_address = shmat(shmid, (void *) 0, 0);
  70.             printf("[PADRE] Ciao, sono stato avviato. Accedo alla regione critica ...\n");
  71.             shared_memory = (struct s_m *)shared_address;
  72.             sem_down(sem_read);
  73.             while(strcmp(shared_memory->message, "end") != 0)
  74.             {
  75.                 printf("[PADRE] Il contenuto del messaggio รจ: %s.\n", shared_memory->message);
  76.                 sem_up(sem_write);
  77.                 sem_down(sem_read);
  78.             }
  79.             printf("[PADRE] Mio figlio mi ha comandato di terminare.\n");
  80.             fflush(stdout);
  81.             break;
  82.     }
  83. }
  84.  
  85. int sem_del(int semid)
  86. {
  87.     if(semctl(semid, 0, IPC_RMID) == -1)
  88.     {
  89.         printf("Error deleting semaphore.\n");
  90.         return -1;
  91.     }
  92.     return 0;
  93. }
  94.  
  95. int sem_set(int semid, int value)
  96. {
  97.     union semun sn;
  98.     sn.val = value;
  99.     if(semctl(semid, 0, SETVAL, sn) == -1)
  100.     {
  101.         printf("Error setting value.\n");
  102.         return -1;
  103.     }
  104.     return 0;
  105. }
  106.  
  107. int sem_up(int semid)
  108. {
  109.     struct sembuf sb;
  110.     sb.sem_num = 0;
  111.     sb.sem_op = 1;
  112.     sb.sem_flg = SEM_UNDO;
  113.     if(semop(semid, &sb, 1) == -1)
  114.     {
  115.         printf("Error upping semaphore.\n");
  116.         return -1;
  117.     }
  118.     return 0;
  119. }
  120.  
  121. int sem_down(int semid)
  122. {
  123.     struct sembuf sb;
  124.     sb.sem_num = 0;
  125.     sb.sem_op = -1;
  126.     sb.sem_flg = SEM_UNDO;
  127.     if(semop(semid, &sb, 1) == -1)
  128.     {
  129.         printf("Error downing semaphore.\n");
  130.         return -1;
  131.     }
  132.     return 0;
  133. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement