Guest User

Untitled

a guest
Jun 20th, 2018
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.25 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5. #include <sys/types.h>
  6. #include <sys/ipc.h>
  7. #include <sys/msg.h>
  8. #include <sys/shm.h>
  9.  
  10. struct komunikat{
  11. long mtype;
  12. char tresc[2];
  13. };
  14.  
  15. int main (void){
  16. int i;
  17. key_t MSGkey, SHMkey;
  18. int MSGid, SHMid;
  19. char *widelce;
  20. char numer_filozofa[2];
  21. struct komunikat kom;
  22. char najedzeni=0;
  23.  
  24. // tworzymy klucz kolejki komunikatów
  25. if ((MSGkey = ftok(".", '*'))==-1){
  26. printf("blad utworzenia klucza kolejki komunikatow.\n");
  27. exit(1);
  28. }
  29.  
  30. // tworzymy klucz pamięci współdzielonej
  31. if ((SHMkey = ftok(".", ')'))==-1){
  32. printf("blad utworzenia klucza pamieci wspoldzielonej.\n");
  33. exit(1);
  34. }
  35.  
  36. // tworzymy kolejkę komunikatów
  37. if((MSGid = msgget(MSGkey,IPC_CREAT|IPC_EXCL|0660))==-1){
  38. printf("blad utworzenia kolejki komunikatow.\n");
  39. exit(1);
  40. }
  41.  
  42. // tworzymy pamięć współdzieloną
  43. if((SHMid = shmget(SHMkey, 5*sizeof(char), IPC_CREAT|IPC_EXCL|0660))==-1){
  44. printf("blad utworzenia obszaru pamieci wspoldzielonej.\n");
  45. exit(1);
  46. }
  47.  
  48. // dołączamy segment pamięci
  49. widelce = (char*) shmat(SHMid, NULL, 0);
  50. if(*widelce==-1){
  51. printf("blad przydzielenia segmentu pamieci.\n");
  52. exit(1);
  53. }
  54.  
  55. // zerujemy tablicę widelców
  56. for(i=0; i<5; i++){
  57. widelce[i]=0;
  58. }
  59.  
  60. // otwieramy procesy filozofów
  61. for(i=0; i<5; i++){
  62. sprintf(numer_filozofa, "%d", i);
  63. switch (fork()){
  64. case -1:
  65. printf("blad utworzenia procesu potomnego!\n");
  66. exit(1);
  67. case 0:
  68. execl("./filozof", numer_filozofa, numer_filozofa, NULL);
  69. break;
  70. }
  71. }
  72.  
  73. printf("program rozpoczyna swoje dzialanie! \n");
  74.  
  75. while(1){
  76. if(najedzeni==5){
  77. printf("Wszyscy filozofowie sa najedzeni! Sukces!\n");
  78. msgctl(MSGid, IPC_RMID, NULL);
  79. shmdt(widelce);
  80. shmctl(SHMid, IPC_RMID, NULL);
  81. exit(0);
  82. }
  83.  
  84. msgrcv(MSGid, (struct komunikat*) &kom, 2, 1, 0);
  85.  
  86. if(kom.tresc[1]=='j') { // jem
  87. printf("filozof numer %d je.\n", kom.tresc[0]);
  88. } else if (kom.tresc[1]=='m') { // myślę
  89. printf("filozof numer %d mysli.\n", kom.tresc[0]);
  90. } else if (kom.tresc[1]=='n') { // najadłem się
  91. printf("filozof numer %d sie najadl i wyszedl.\n", kom.tresc[0]);
  92. najedzeni++;
  93. }
  94.  
  95. fflush(stdout);
  96.  
  97. }
  98.  
  99. return 0;
  100. }
Add Comment
Please, Sign In to add comment