Advertisement
wowonline

Untitled

Dec 14th, 2021
868
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.  
  39.                 if (sem == 2) {
  40.                     _exit(0);
  41.                 }
  42.                 value = mapped[1];
  43.                 value++;
  44.                 printf("%d %d %d\n", mapped[0], mapped[1], mapped[2]);
  45.                 fflush(stdout);
  46.                 if (value > maxval) {
  47.                     sem = 2;
  48.                     for (int j = 0; j < nproc; ++j) {
  49.                         write(evarray[j], &sem, sizeof(sem));
  50.                     }
  51.                 } else {
  52.                     target = (value%nproc)*(value%nproc)*(value%nproc)*
  53.                                 (value%nproc)%nproc + 1;
  54.                    
  55.                     mapped[0] = target;
  56.                     mapped[1] = value;
  57.                     mapped[2] = i+1;
  58.                     write(evarray[target-1], &sem, sizeof(sem));
  59.                 }
  60.             }
  61.             _exit(0);
  62.         }
  63.     }
  64.     mapped[0] = 1;
  65.     mapped[1] = 0;
  66.     mapped[2] = 0;
  67.     write(evarray[0], &sem, sizeof(maxval));
  68.    
  69.     while (wait(NULL) > 0) {}
  70.     for (int i = 0; i < nproc; ++i) {
  71.         close(evarray[i]);
  72.     }
  73.     return 0;
  74. }
Advertisement
RAW Paste Data Copied
Advertisement