Advertisement
Guest User

projekt5

a guest
Jan 16th, 2018
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.43 KB | None | 0 0
  1. // includes.h
  2.  
  3. #ifndef INCLUDES_H
  4. #define INCLUDES_H
  5.  
  6. #include <stdio.h>
  7. #include <unistd.h>
  8. #include <stdlib.h>
  9. #include <stdio.h>
  10. #include <sys/wait.h>
  11. #include <sys/types.h>
  12. #include <sys/ipc.h>
  13. #include <sys/sem.h>
  14. #include <sys/shm.h>
  15. #include <errno.h>
  16.  
  17. #endif
  18.  
  19. // semafory.h
  20.  
  21. #ifndef SEMAFORY_H
  22. #define SEMAFORY_H
  23.  
  24. int semafor;
  25.  
  26. void semafor_create(void);
  27. void semafor_set(void);
  28. void semafor_wait(unsigned short sem_number);
  29. void semafor_signal(unsigned short sem_number);
  30. void semafor_delete(void);
  31. void semafor_access_child(void);
  32.  
  33. #endif
  34.  
  35. // semafory.c
  36.  
  37. #include "semafory.h"
  38. #include "includes.h"
  39.  
  40. void semafor_create(void)
  41. {
  42.   key_t klucz = ftok(".", 'A');
  43.  
  44.   if (klucz == -1)
  45.   {
  46.     perror("Błąd ftok\n");
  47.     exit(-1);
  48.   }
  49.   else
  50.     semafor = semget(klucz, 2, 0600 | IPC_CREAT | IPC_EXCL);
  51.  
  52.   if (semafor == -1)
  53.   {
  54.     printf("Błąd utworzenia semafora\n");
  55.     exit(EXIT_FAILURE);
  56.   }
  57.   else
  58.     printf("Semafor został utworzony: %d\n", semafor);
  59. }
  60.  
  61. void semafor_access_child(void)
  62. {
  63.   key_t klucz = ftok(".", 'A');
  64.  
  65.   if (klucz == -1)
  66.   {
  67.     perror("Błąd ftok\n");
  68.     exit(-1);
  69.   }
  70.   else
  71.     semafor = semget(klucz, 1, 0600 | IPC_CREAT);
  72.  
  73.   if (semafor == -1)
  74.   {
  75.     printf("Błąd dostępu do semafora dziecka\n");
  76.     exit(EXIT_FAILURE);
  77.   }
  78.   else
  79.     printf("Semafor został odnaleziony i uzyskał dostęp: %d\n", semafor);
  80. }
  81.  
  82. void semafor_set(void)
  83. {
  84.   int ustaw_sem;
  85.   unsigned short arr[2] = {1, 0};
  86.  
  87.   ustaw_sem = semctl(semafor, 0, SETALL, arr);
  88.  
  89.   if (ustaw_sem == -1)
  90.   {
  91.     printf("Błąd ustawiania semafora\n");
  92.     exit(EXIT_FAILURE);
  93.   }
  94.   else
  95.     printf("Semafory zostały ustawione.\n");
  96. }
  97.  
  98. void semafor_wait(unsigned short sem_number)
  99. {
  100.   int zmien_sem;
  101.   struct sembuf bufor_sem;
  102.   bufor_sem.sem_num = sem_number;
  103.   bufor_sem.sem_op = -1;
  104.   bufor_sem.sem_flg = 0;
  105.  
  106.   for (;;)
  107.   {
  108.     zmien_sem = semop(semafor, &bufor_sem, 1);
  109.    
  110.     if (zmien_sem == 0 || errno != 4)
  111.       break;
  112.   }
  113.  
  114.   if (zmien_sem == -1 && errno != 4)
  115.   {
  116.     printf("Błąd zamykania semafora\n");
  117.     semafor_delete();
  118.     exit(EXIT_FAILURE);
  119.   }
  120.   else
  121.   {
  122.     int stan = semctl(semafor, 0, GETVAL);
  123.     if (stan != -1)
  124.     {
  125.       printf("Stan semafora wait() = %d\n", stan);
  126.       printf("\tsemafor_wait() - opuszczanie semafora\n");
  127.     }
  128.   }
  129. }
  130.  
  131. void semafor_signal(unsigned short sem_number)
  132. {
  133.   int zmien_sem;
  134.   struct sembuf bufor_sem;
  135.   bufor_sem.sem_num = sem_number;
  136.   bufor_sem.sem_op = 1;
  137.   bufor_sem.sem_flg = 0;
  138.  
  139.   for (;;)
  140.   {
  141.     zmien_sem = semop(semafor, &bufor_sem, 1);
  142.  
  143.     if (zmien_sem == 0 || errno != 4)
  144.       break;
  145.   }
  146.  
  147.   if (zmien_sem == -1 && errno != 4)
  148.   {
  149.     printf("Błąd otwierania semafora\n");
  150.     semafor_delete();
  151.     exit(EXIT_FAILURE);
  152.   }
  153.   else
  154.   {
  155.     int stan = semctl(semafor, 0, GETVAL);
  156.     if (stan != 1)
  157.     {
  158.       printf("Stan semafora signal() = %d\n", stan);
  159.       printf("\tsemafor_signal() - podniesienie semafora\n");
  160.     }
  161.   }
  162. }
  163.  
  164. void semafor_delete(void)
  165. {
  166.   int sem;
  167.   sem = semctl(semafor, 0, IPC_RMID);
  168.  
  169.   if (sem == -1)
  170.   {
  171.     printf("Błąd usuwania semafora\n");
  172.     exit(EXIT_FAILURE);
  173.   }
  174.   else
  175.     printf("Semafory zostały usunięte. Kod: %d\n", sem);
  176. }
  177.  
  178. // pamiec_dzielona.h
  179.  
  180. #ifndef PAMIEC_DZIELONA_H
  181. #define PAMIEC_DZIELONA_H
  182.  
  183. int id_pamiec;
  184. char *address;
  185.  
  186. void pd_create(int is_producent);
  187. char *pd_address();
  188. void pd_detach(int only_d2);
  189.  
  190. #endif
  191.  
  192. // pamiec_dzielona.c
  193.  
  194. #include "includes.h"
  195. #include "pamiec_dzielona.h"
  196. #include "semafory.h"
  197.  
  198. void pd_create(int is_producent)
  199. {
  200.   key_t klucz = ftok(".", 'B');
  201.  
  202.   if (klucz == -1)
  203.   {
  204.     perror("Błąd ftok\n");
  205.     exit(-1);
  206.   }
  207.   else
  208.   {
  209.     if (is_producent == 1)
  210.     {
  211.       printf("Producent - shmget: ");
  212.       id_pamiec = shmget(klucz, sizeof(char), 0600 | IPC_CREAT);
  213.     }
  214.     else
  215.     {
  216.       printf("Konsument - shmget: ");
  217.       id_pamiec = shmget(klucz, sizeof(char), 0600 | IPC_CREAT);
  218.     }
  219.   }
  220.  
  221.   if (id_pamiec == -1)
  222.   {
  223.     printf("Błąd shmget: %d\n", errno);
  224.     exit(-1);
  225.   }
  226.   else
  227.     printf("Utworzono segment pamięci: %d\n", id_pamiec);
  228. }
  229.  
  230. char *pd_address()
  231. {
  232.   char *address2;
  233.  
  234.   address2 = (char *)shmat(id_pamiec, 0, 0);
  235.  
  236.   if (address2 == (char *) -1)
  237.   {
  238.     perror("Błąd shmat\n");
  239.     exit(-1);
  240.   }
  241.   else
  242.     printf("Uzyskano adres %p segmentu pamięci %d\n", &address2, id_pamiec);
  243.  
  244.   address = address2;
  245.   return address2;
  246. }
  247.  
  248. void pd_detach(int only_d2)
  249. {
  250.   int d1, d2;
  251.  
  252.   if (!only_d2)
  253.   {
  254.     d1 = shmctl(id_pamiec, IPC_RMID, 0);
  255.     d2 = shmdt(address);
  256.  
  257.     if (d1 == -1 || d2 == -1)
  258.     {
  259.       perror("Błąd shmctl lub shmdt\n");
  260.       exit(-1);
  261.     }
  262.     else
  263.       printf("Odłączono pamięć dzieloną: %d\n", id_pamiec);
  264.   }
  265.   else
  266.   {
  267.     d2 = shmdt(address);
  268.  
  269.     if (d2 == -1)
  270.     {
  271.       perror("Błąd shmdt\n");
  272.       exit(-1);
  273.     }
  274.     else
  275.       printf("Odłączono pamięć dzieloną: %d\n", id_pamiec);
  276.   }
  277. }
  278.  
  279. // producent.c
  280.  
  281. #include "includes.h"
  282. #include "pamiec_dzielona.h"
  283. #include "semafory.h"
  284.  
  285. int main()
  286. {
  287.   printf("Proces producenta: PID = %d\n", getpid());
  288.  
  289.   semafor_create();
  290.   semafor_set();
  291.  
  292.   FILE *input_file;
  293.   char ch = '0';
  294.  
  295.   pd_create(1);
  296.   pd_address();
  297.  
  298.   input_file = fopen("./input.txt", "r");
  299.  
  300.   if (!input_file)
  301.   {
  302.     perror("Błąd odczytu pliku wejściowego\n");
  303.     pd_detach(0);
  304.     semafor_delete();
  305.     exit(-1);
  306.   }
  307.   else
  308.   {
  309.     do
  310.     {
  311.       printf("\t\tProducent (%d): ", getpid());
  312.  
  313.       ch = (char) fgetc(input_file);
  314.  
  315.       if (ch != EOF)
  316.       {
  317.         semafor_wait(0);
  318.  
  319.         *address = ch;
  320.  
  321.         if (ch == 0x0A)
  322.           printf("Producent - zapis (%d) = Enter\n", ch);
  323.         else if (ch == 32)
  324.           printf("Producent - zapis (%d) = Spacja\n", ch);
  325.         else
  326.           printf("Producent - zapis (%d) = (%c)\n", ch, ch);
  327.        
  328.         semafor_signal(1);
  329.       }
  330.     } while (ch != EOF);
  331.  
  332.     semafor_wait(0);
  333.     *address = EOF;
  334.     semafor_signal(1);
  335.   }
  336.  
  337.   semafor_signal(1);
  338.  
  339.   if (ch == EOF)
  340.   {
  341.     semafor_signal(1);
  342.     semafor_wait(0);
  343.     fclose(input_file);
  344.   }
  345.  
  346.   printf("Zakończenie pracy producenta.\n");
  347.  
  348.   return 0;
  349. }
  350.  
  351. // konsument.c
  352.  
  353. #include "includes.h"
  354. #include "pamiec_dzielona.h"
  355. #include "semafory.h"
  356.  
  357. int main()
  358. {
  359.   printf("Proces konsumenta: PID = %d\n", getpid());
  360.  
  361.   semafor_access_child();
  362.  
  363.   FILE *output_file;
  364.   char ch = '0';
  365.  
  366.   pd_create(0);
  367.   pd_address();
  368.  
  369.   output_file = fopen("./output.txt", "w");
  370.  
  371.   if (!output_file)
  372.   {
  373.     perror("Błąd odczytu pliku wyjściowego\n");
  374.     pd_detach(0);
  375.     semafor_delete();
  376.     exit(-1);
  377.   }
  378.   else
  379.   {
  380.     do
  381.     {
  382.       printf("\t\tKonsument (%d): ", getpid());
  383.  
  384.       semafor_wait(1);
  385.  
  386.       ch = *address;
  387.  
  388.       if (ch != EOF)
  389.       {
  390.         fputc(ch, output_file);
  391.        
  392.         if (ch == 0x0A)
  393.           printf("Konsument - odczyt (%d) = Enter\n", ch);
  394.         else if (ch == 32)
  395.           printf("Konsument - odczyt (%d) = Spacja\n", ch);
  396.         else
  397.           printf("Konsument - odczyt (%d) = (%c)\n", ch, ch);
  398.  
  399.         semafor_signal(0);
  400.       }
  401.     } while (ch != EOF);
  402.   }
  403.  
  404.   if (ch == EOF)
  405.   {
  406.     semafor_wait(1);
  407.     fclose(output_file);
  408.     semafor_signal(0);
  409.     shmdt(address);
  410.     shmctl(id_pamiec, IPC_RMID, 0);
  411.   }
  412.  
  413.   semafor_delete();
  414.  
  415.   printf("Zakończenie pracy konsumenta.\n");
  416.  
  417.   return 0;
  418. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement