Advertisement
wowonline

Untitled

Dec 14th, 2021
823
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <stdlib.h>
  2. #include <sys/eventfd.h>
  3. #include <unistd.h>
  4. #include <sys/mman.h>
  5. #include <fcntl.h>
  6. #include <sys/wait.h>
  7. #include <stdio.h>
  8. #include <sys/types.h>
  9. #include <sys/ipc.h>
  10. #include <sys/sem.h>
  11.  
  12. enum { DECIMAL_BASE = 10 };
  13.  
  14.  
  15. int
  16. main(int argc, char *argv[])
  17. {
  18.     pid_t pid;
  19.     int nproc = strtol(argv[1], NULL, DECIMAL_BASE);
  20.     int maxval = strtol(argv[3], NULL, DECIMAL_BASE);
  21.     int *mapped = mmap(NULL, 3*sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
  22.     if (mapped == MAP_FAILED) {
  23.         return 1;
  24.     }
  25.     int evarray[nproc], sem = 1;
  26.  
  27.     for (int i = 0; i < nproc; ++i) {
  28.         evarray[i] = eventfd(0, 0);
  29.     }
  30.     for (int i = 0; i < nproc; ++i) {
  31.         pid = fork();
  32.         if (pid == -1) {
  33.             _exit(1);
  34.         } else if (!pid) {
  35.             int value, target;
  36.             while (1) {
  37.                 read(evarray[i], &sem, sizeof(sem));
  38.                 if (sem == 2) {
  39.                     _exit(0);
  40.                 }
  41.                 value = mapped[1];
  42.                 value++;
  43.                 printf("%d %d %d\n", mapped[0], mapped[1], mapped[2]);
  44.                 fflush(stdout);
  45.                 if (value > maxval) {
  46.                     sem = 2;
  47.                     for (int j = 0; j < nproc; ++j) {
  48.                         write(evarray[j], &sem, sizeof(sem));
  49.                     }
  50.                 } else {
  51.                     target = (value%nproc)*(value%nproc)*(value%nproc)*
  52.                                 (value%nproc)%nproc + 1;
  53.                    
  54.                     mapped[0] = target;
  55.                     mapped[1] = value;
  56.                     mapped[2] = i+1;
  57.                     write(evarray[target-1], &sem, sizeof(sem));
  58.                 }
  59.             }
  60.             _exit(0);
  61.         }
  62.     }
  63.     mapped[0] = 1;
  64.     mapped[1] = 0;
  65.     mapped[2] = 0;
  66.     write(evarray[0], &sem, sizeof(maxval));
  67.    
  68.     while (wait(NULL) > 0) {}
  69.     for (int i = 0; i < nproc; ++i) {
  70.         close(evarray[i]);
  71.     }
  72.     return 0;
  73. }
Advertisement
RAW Paste Data Copied
Advertisement