Advertisement
Guest User

Untitled

a guest
May 27th, 2018
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.73 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <pthread.h>
  5. #include <sys/types.h>
  6. #include <sys/sem.h>
  7. #define N 5
  8. #define RIGHT_FORK ( left_fork_id + 1 ) % N
  9.  
  10. int phil_id,sem_id;
  11. pid_t pid;
  12.  
  13. void grab_forks(int left_fork_id)
  14. {
  15. int right_fork_id = RIGHT_FORK;
  16. struct sembuf semaphore[2] =
  17. {
  18. {right_fork_id, -1, 0},
  19. {left_fork_id, -1, 0}
  20. };
  21.  
  22. if (semop(sem_id, semaphore, 2) == -1)
  23. {
  24. printf("Semop Error \n");
  25. }
  26.  
  27. printf("[%d]: I am taking: %d and: %d.\n", phil_id,left_fork_id,right_fork_id);
  28. }
  29. void put_away_forks(int left_fork_id)
  30. {
  31. int right_fork_id = RIGHT_FORK;
  32. struct sembuf semaphore[2] =
  33. {
  34. {right_fork_id, 1, 0},
  35. {left_fork_id, 1, 0}
  36. };
  37.  
  38. if (semop(sem_id, semaphore, 2) == -1)
  39. {
  40. printf("Semop Error \n");
  41. }
  42.  
  43. printf("[%d]: I am putting away: %d and: %d.\n", phil_id,left_fork_id,right_fork_id);
  44. }
  45.  
  46. void eat()
  47. {
  48. printf("[%d], I am eating\n",phil_id);
  49. sleep(1);
  50. }
  51. void think()
  52. {
  53. printf("[%d], I am thinking\n",phil_id);
  54. sleep(2);
  55. }
  56.  
  57.  
  58. void philosopher(int i)
  59. {
  60. // while (1)
  61. // {
  62. think();
  63. sleep(1);
  64. grab_forks(i);
  65. sleep(0);
  66. eat();
  67. put_away_forks(i);
  68. // }
  69. }
  70.  
  71.  
  72.  
  73. int main()
  74. {
  75. //getting semaphore set ID
  76. if ((sem_id = semget(777, 5, IPC_CREAT | 0666)) == -1)
  77. {
  78. perror("Cannot get semaphore set id\n");
  79. exit(1);
  80. }
  81. //
  82. for (int i = 0; i < N; i++)
  83. semctl(sem_id, i, SETVAL, 1);
  84.  
  85. for (int i = 0; i < N; i++)
  86. {
  87. if ((pid == fork())== 0)
  88. {
  89. phil_id = i;
  90. philosopher(phil_id);
  91. printf("[%d], I have finished eating\n", phil_id);
  92. exit(0);
  93. }
  94. else if (pid < 0)
  95. {
  96. printf("Something went wrong");
  97. exit(1);
  98. }
  99.  
  100. }
  101.  
  102. return 0;
  103. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement