Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <fcntl.h>
- #include <sys/wait.h>
- #include <signal.h>
- #include <sys/ipc.h>
- #include <sys/sem.h>
- #include <sys/shm.h>
- #include <sys/msg.h>
- #include <sys/types.h>
- enum { BASE = 10 };
- int main(int argc, char *argv[]) {
- setbuf(stdin, NULL);
- //int count = (int) strtol(argv[1], NULL, BASE);
- int count = 3;
- int sem_id = semget(IPC_PRIVATE, count + 1, 0666 | IPC_CREAT | IPC_EXCL);
- if (sem_id < 0) {
- exit(1);
- }
- pid_t pid[count];
- for (int i = 0; i < count; i++) {
- pid[i] = fork();
- if (pid[i] == 0) {
- while (1) {
- if ((semop(sem_id, (struct sembuf[]){{count, -1, IPC_NOWAIT}}, 1) >= 0) || (semop(sem_id, (struct sembuf[]){{i, -1, 0}}, 1) >= 0)) {
- if (semop(sem_id, (struct sembuf[]){{i, -1, 0}}, 1) >= 0) {
- int tmp;
- if (scanf("%d", &tmp) == EOF) {
- semop(sem_id,(struct sembuf[]){{count, count, 0}},1);
- }
- printf("%d %d\n", i, tmp);
- tmp = ((tmp % count) + count) % count;
- semop(sem_id,(struct sembuf[]){{tmp, 2, 0}},1);
- } else {
- exit(0);
- }
- }
- /*if (semop(sem_id, (struct sembuf[]){{count, -1, 0}}, 1) >= 0) {
- exit(0);
- }*/
- }
- /*while (semop(sem_id, (struct sembuf[]){{i, -1, 0}}, 1) >= 0) {
- int tmp;
- if (scanf("%d", &tmp) == EOF) {
- semop(sem_id,(struct sembuf[]){{count, 1, 0}},1);
- }
- printf("%d %d\n", i, tmp);
- tmp = ((tmp % count) + count) % count;
- semop(sem_id,(struct sembuf[]){{tmp, 1, 0}},1);
- } */
- } else if (pid[i] < 0) {
- exit(1);
- }
- }
- semop(sem_id, (struct sembuf[]) {{0, 2, 0}}, 1);
- while (wait(NULL) > 0) {
- }
- semctl(sem_id, 0, IPC_RMID);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement