Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <unistd.h>
- #include <sys/wait.h>
- #include <sys/ipc.h>
- #include <sys/shm.h>
- #include <stdlib.h>
- #include <sys/sem.h>
- #include <time.h>
- #define SHMSIZE 1
- union semun
- {
- int val;
- struct semid_ds *buf;
- unsigned short *array;
- };
- int main()
- {
- pid_t pid;
- key_t key;
- char *buff;
- int shmid;
- char symbol;
- int semid;
- key = ftok(".", 1);
- semid = semget(key, 2, IPC_CREAT | 0755);
- union semun un;
- unsigned short arr[2] = { 1, 0 };
- un.array = arr;
- semctl(semid, 0, SETALL, un);
- struct sembuf popProduce;
- popProduce.sem_num = 0;
- popProduce.sem_op = -1;
- popProduce.sem_flg = 0;
- struct sembuf vopProduce;
- vopProduce.sem_num = 0;
- vopProduce.sem_op = 1;
- vopProduce.sem_flg = 0;
- struct sembuf popConsume;
- popConsume.sem_num = 1;
- popConsume.sem_op = -1;
- popConsume.sem_flg = 0;
- struct sembuf vopConsume;
- vopConsume.sem_num = 1;
- vopConsume.sem_op = 1;
- vopConsume.sem_flg = 0;
- pid = fork();
- if (pid == -1)
- {
- perror("fork");
- exit(EXIT_FAILURE);
- }
- else if (pid == 0)
- {
- shmid = shmget(key, SHMSIZE, IPC_CREAT | 0755);
- buff = shmat(shmid, NULL, 0);
- for (symbol = 'a'; symbol <= 'z'; symbol++)
- {
- int i = (rand() % (20000 - 1000 + 1)) + 1000;
- int j = (rand() % (20000 - 1000 + 1)) + 1000;
- semop(semid, &popProduce, 1);
- usleep(i);
- *buff = symbol;
- usleep(j);
- semop(semid, &vopConsume, 1);
- }
- shmdt(buff);
- }
- else if (pid > 0)
- {
- int i;
- shmid = shmget(key, SHMSIZE, IPC_CREAT | 0755);
- buff = shmat(shmid, 0, 0);
- for (i = 0; i <= 'z' - 'a'; i++)
- {
- int i = (rand() % (20000 - 1000 + 1)) + 1000;
- int j = (rand() % (20000 - 1000 + 1)) + 1000;
- semop(semid, &popConsume, 1);
- usleep(i);
- symbol = *buff;
- printf("Received symbol: %c\n", symbol);
- usleep(j);
- semop(semid, &vopProduce, 1);
- }
- shmdt(buff);
- wait(NULL);
- shmctl(shmid, IPC_RMID, NULL);
- semctl(semid, 0, IPC_RMID, NULL);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment