Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdlib.h>
- #include <sys/eventfd.h>
- #include <unistd.h>
- #include <sys/mman.h>
- #include <fcntl.h>
- #include <sys/wait.h>
- #include <stdio.h>
- #include <sys/types.h>
- #include <sys/ipc.h>
- #include <sys/sem.h>
- enum { DECIMAL_BASE = 10 };
- int
- main(int argc, char *argv[])
- {
- pid_t pid;
- int nproc = strtol(argv[1], NULL, DECIMAL_BASE);
- int maxval = strtol(argv[3], NULL, DECIMAL_BASE);
- int *mapped = mmap(NULL, 3*sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
- if (mapped == MAP_FAILED) {
- return 1;
- }
- int evarray[nproc], sem = 1;
- for (int i = 0; i < nproc; ++i) {
- evarray[i] = eventfd(0, 0);
- }
- for (int i = 0; i < nproc; ++i) {
- pid = fork();
- if (pid == -1) {
- _exit(1);
- } else if (!pid) {
- int value, target;
- while (1) {
- read(evarray[i], &sem, sizeof(sem));
- if (sem == 2) {
- _exit(0);
- }
- value = mapped[1];
- value++;
- printf("%d %d %d\n", mapped[0], mapped[1], mapped[2]);
- fflush(stdout);
- if (value > maxval) {
- sem = 2;
- for (int j = 0; j < nproc; ++j) {
- write(evarray[j], &sem, sizeof(sem));
- }
- } else {
- target = (value%nproc)*(value%nproc)*(value%nproc)*
- (value%nproc)%nproc + 1;
- mapped[0] = target;
- mapped[1] = value;
- mapped[2] = i+1;
- write(evarray[target-1], &sem, sizeof(sem));
- }
- }
- _exit(0);
- }
- }
- mapped[0] = 1;
- mapped[1] = 0;
- mapped[2] = 0;
- write(evarray[0], &sem, sizeof(maxval));
- while (wait(NULL) > 0) {}
- for (int i = 0; i < nproc; ++i) {
- close(evarray[i]);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement