Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <unistd.h>
- #include <sys/types.h>
- #include <sys/ipc.h>
- #include <sys/wait.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <sys/sem.h>
- #include <sys/shm.h>
- int main(int argc, char *argv[])
- {
- int count, key, max_val;
- sscanf(argv[1], "%d", &count);
- key = (int) strtol(argv[2], NULL, 16);
- sscanf(argv[3], "%d", &max_val);
- int semid = semget(key, count, 0666 | IPC_CREAT);
- int shmid = shmget(key, 2 * sizeof(int), 0666 | IPC_CREAT);
- int *num = (int *) shmat(shmid, NULL, 0);
- num[0] = 0;
- num[1] = 0;
- for (int i = 0; i < count; i++) {
- pid_t pid = fork();
- if (pid < 0) {
- _exit(1);
- } else if (pid == 0) {
- while (1) {
- int s = semop(semid, &(struct sembuf) {.sem_num = i, .sem_op = -1, .sem_flg = 0}, 1);
- if (s < 0) {
- exit(0);
- }
- printf("%d %d %d\n", i + 1, num[0], num[1]);
- fflush(stdout);
- num[0] += 1;
- if (num[0] > max_val) {
- semctl(semid, 0, IPC_RMID);
- exit(0);
- }
- int tmp_num = (num[0] * num[0] * num[0] * num[0]) % count;
- num[1] = i + 1;
- semop(semid, &(struct sembuf) {.sem_num = tmp_num, .sem_op = 1, .sem_flg = 0}, 1);
- }
- }
- }
- semop(semid, &(struct sembuf) {.sem_num = 0, .sem_op = 1, .sem_flg = 0}, 1);
- while (wait(NULL) > 0) {}
- semctl(semid, 0, IPC_RMID);
- shmctl(shmid, 0, IPC_RMID);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement