Advertisement
Guest User

prod

a guest
Jan 22nd, 2020
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.70 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <sys/ipc.h>
  4. #include <sys/msg.h>
  5. #include <sys/shm.h>
  6. #include <unistd.h>
  7. #include <stdlib.h>
  8. #include <sys/sem.h>
  9. #include "operacje.c"
  10. #include "operacje.h"
  11. struct bufor{
  12. long mtype;
  13. int mvalue;
  14. };
  15.  
  16. int *pam;
  17.  
  18. #define MAX 10
  19. #define MAX2 12
  20. #define PELNY 2
  21. #define PUSTY 1
  22. #define odczyt pam[MAX]
  23. #define zapis pam[MAX+1]
  24. #define N 2
  25. int main()
  26. {
  27. key_t klucz, kluczm, kluczs;
  28. int msgID;
  29. int shmID;
  30. int semID;
  31. struct bufor komunikat;
  32.  
  33. //printf("producent--------------------------------\n");
  34.  
  35. //uzyskanie dostepu do kolejki komunikatow
  36. if((klucz=ftok(".", 'A'))==-1){
  37. printf("blad ftok A\n");
  38. exit(-2);
  39. }
  40. msgID=msgget(klucz, IPC_CREAT|0666);
  41. if(msgID==-1){
  42. printf("blad kolejki komunikatow(producent)\n");
  43. exit(1);
  44. }
  45.  
  46. //****************************************************************
  47. //uzyskanie dostepu do pamieci dzielonej
  48. if((kluczm=ftok(".", 'B'))==-1){
  49. printf("blad ftok B\n");
  50. exit(-2);
  51. }
  52. shmID=shmget(kluczm, MAX2*sizeof(int), IPC_CREAT|0666);
  53. if(shmID==-1){
  54. printf("blad pamieci dzielonej(producent)\n");
  55. exit(1);
  56. }
  57.  
  58. //****************************************************************
  59. //przylaczenie pamieci dzielonej pam=(int*)shmat(shmID, NULL, 0);
  60. if(pam==NULL){
  61. printf("blad przylaczania pamieci dzielonej(producent)\n");
  62. }
  63.  
  64. //****************************************************************
  65. //semafor
  66. if((kluczs=ftok(".", 'C'))==-1){
  67. printf("blad ftok C\n");
  68. exit(-2);
  69. }
  70.  
  71. semID=semget(kluczs, N, IPC_CREAT|0666);
  72.  
  73. //****************************************************************
  74. //wysylanie/odbieranie odpowiednich komunikatow
  75.  
  76. if(msgrcv(msgID, &komunikat, sizeof(komunikat.mvalue), PUSTY, 0)==-1){
  77. printf("blad odbioru PUSTEGO komunikatu\n");
  78. exit(1);
  79. }else{
  80. printf("odebralem komunikat PUSTY\n");
  81. }
  82. //wait pusty
  83. waitSemafor(semID, PUSTY, IPC_CREAT | 0666);
  84. pam[zapis]=getpid();
  85. komunikat.mtype=PELNY;
  86. if(msgsnd(msgID, &komunikat, sizeof(komunikat.mvalue), 0)==-1){
  87. printf("blad wysylania komunikatu PELNEGO\n");
  88. exit(1);
  89. }else{
  90. printf("wyslalem PELNY\n");
  91. }
  92.  
  93. //produkcja - dodanie rekordu do puli buforow --pid'u procesu pod indeks - zapis
  94. printf("Producent pid - %i, index - %d, zapisano - %d\n", getpid(), zapis, pam[zapis]);
  95. //modyfikacja indeksu do zapisu
  96. zapis=(zapis+1)%MAX;
  97. //signal pusty
  98. signalSemafor(semID, PUSTY);
  99.  
  100. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement