Advertisement
Guest User

main

a guest
Jan 22nd, 2020
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.79 KB | None | 0 0
  1. #include <stdio.h>
  2. #include<sys/ipc.h>
  3. #include<sys/msg.h>
  4. #include <unistd.h>
  5. #include <stdlib.h>
  6. #include <sys/wait.h>
  7. #include <sys/sem.h>
  8. #include <sys/shm.h>
  9. #include <fcntl.h>
  10. #include "operacje.c"
  11. #include "operacje.h"
  12.  
  13. #define P 50 // liczba procesow prod i kons
  14. #define MAX 10 //rozmiar buforu
  15. #define MAX2 12 // + dwa pola na indeksy zapis/odczyt
  16. #define PUSTY 1 //typ komunikatu
  17. #define PELNY 2 //typ komunikatu
  18. #define N 2
  19.  
  20. //struktura komunikatu
  21. struct bufor{
  22. long mtype;
  23. int mvalue;
  24. };
  25.  
  26. // funkcja do obsługi sygnału 2 SIGINT
  27.  
  28. int main()
  29. {
  30. key_t klucz, kluczm, kluczs; //klucze do kk, pam. dz. i sem
  31. int msgID; //id kolejki kom.
  32. int shmID; //id pamieci dzielonej
  33. int semID;
  34.  
  35. int i;
  36. struct bufor komunikat;
  37. //****************************************************************************************
  38. //tworzenie klucza do kolejki komunikatow i uzyskiwanie dostepu do niej
  39. if ( (klucz = ftok(".", 'A')) == -1 )
  40. {
  41. printf("Blad ftok (a)\n");
  42. exit(-2);
  43. }
  44.  
  45. msgID=msgget(klucz,IPC_CREAT|IPC_EXCL|0666); //tworzenie kk
  46. if (msgID==-1)
  47. {printf("blad kolejki komunikatow\n"); exit(1);}
  48. //****************************************************************************************
  49. //tworzenie klucza do pamieci dzielonej i uzyskiwanie dostepu do niej
  50. if((kluczm=ftok(".",'B'))==-1){
  51. printf("blad ftok (b)\n");
  52. exit(-2);
  53. }
  54. shmID=shmget(kluczm, MAX2*sizeof(int), IPC_CREAT|IPC_EXCL|0666);//tworzenie pam. dz.
  55. //****************************************************************************************
  56. //tworzenie klucza do semaforu, alokacja oraz inicjalizacja
  57. if((kluczs=ftok(".", 'C'))==-1){
  58. printf("blad ftok (c)\n");
  59. exit(-2); }
  60. semID=semget(kluczs, N, IPC_CREAT|IPC_EXCL|0666);//alokacja semaforów
  61. if(semID==-1){
  62. printf("blad semget\n");
  63. exit(1);
  64. }
  65. //semctl(semID, 0, SETVAL, 0);????????????????
  66. semctl(semID, PUSTY, SETVAL, 1);
  67. semctl(semID, PELNY, SETVAL, 1);
  68. printf("Semafory gotowe!\n");
  69. //****************************************************************************************
  70. //wysylanie komunikatow, uruchamianie konumentow i producentow
  71. komunikat.mtype=PUSTY;
  72. komunikat.mvalue=0; // wazny jest typ komunikatu, tresc - dowolna
  73.  
  74. for(i=0;i<MAX;i++)
  75. {
  76. if( msgsnd(msgID,&komunikat,sizeof(komunikat.mvalue),0)==-1) //wyslanie komunikatu typu pusty
  77. {
  78. printf("blad wyslania kom. pustego\n");
  79. exit(1);
  80. };
  81. printf("wyslany pusty komunikat %d\n",i);
  82. }
  83.  
  84. for (i = 0; i < P; i++)
  85. switch (fork())
  86. {
  87. case -1:
  88. perror("Blad fork (mainprog)");
  89. exit(2);
  90. case 0:
  91. execl("./prod","prod", NULL);
  92. }
  93.  
  94. for(i=0;i<P;i++)
  95. switch (fork())
  96. {
  97. case -1:
  98.  
  99. printf("Blad fork (mainprog)\n");
  100. exit(2);
  101. case 0:
  102. execl("./kons","kons",NULL);
  103. }
  104.  
  105. /*
  106. if (fork()==0)
  107. execl("./prod","prod", NULL);
  108. else
  109. execl("./kons","kons",NULL);
  110. */
  111. for(i=0;i<2*P;i++)
  112. wait(NULL);
  113.  
  114. //zwalnianie zasobow
  115. msgctl(msgID,IPC_RMID,NULL);
  116. shmctl(shmID,IPC_RMID, NULL);
  117. semctl(semID, N, IPC_RMID, NULL); printf("MAIN: Koniec.\n");
  118. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement