Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <pthread.h>
- #include <sys/types.h>
- #include <sys/sem.h>
- #define N 5
- #define RIGHT_FORK ( left_fork_id + 1 ) % N
- int phil_id,sem_id;
- pid_t pid;
- void grab_forks(int left_fork_id)
- {
- int right_fork_id = RIGHT_FORK;
- struct sembuf semaphore[2] =
- {
- {right_fork_id, -1, 0},
- {left_fork_id, -1, 0}
- };
- if (semop(sem_id, semaphore, 2) == -1)
- {
- printf("Semop Error \n");
- }
- printf("[%d]: I am taking: %d and: %d.\n", phil_id,left_fork_id,right_fork_id);
- }
- void put_away_forks(int left_fork_id)
- {
- int right_fork_id = RIGHT_FORK;
- struct sembuf semaphore[2] =
- {
- {right_fork_id, 1, 0},
- {left_fork_id, 1, 0}
- };
- if (semop(sem_id, semaphore, 2) == -1)
- {
- printf("Semop Error \n");
- }
- printf("[%d]: I am putting away: %d and: %d.\n", phil_id,left_fork_id,right_fork_id);
- }
- void eat()
- {
- printf("[%d], I am eating\n",phil_id);
- sleep(1);
- }
- void think()
- {
- printf("[%d], I am thinking\n",phil_id);
- sleep(2);
- }
- void philosopher(int i)
- {
- // while (1)
- // {
- think();
- sleep(1);
- grab_forks(i);
- sleep(0);
- eat();
- put_away_forks(i);
- // }
- }
- int main()
- {
- //getting semaphore set ID
- if ((sem_id = semget(777, 5, IPC_CREAT | 0666)) == -1)
- {
- perror("Cannot get semaphore set id\n");
- exit(1);
- }
- //
- for (int i = 0; i < N; i++)
- semctl(sem_id, i, SETVAL, 1);
- for (int i = 0; i < N; i++)
- {
- if ((pid == fork())== 0)
- {
- phil_id = i;
- philosopher(phil_id);
- printf("[%d], I have finished eating\n", phil_id);
- exit(0);
- }
- else if (pid < 0)
- {
- printf("Something went wrong");
- exit(1);
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement