SHARE
TWEET

Untitled

a guest Dec 16th, 2019 72 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <sys/stat.h>
  4. #include <sys/types.h>
  5. #include <fcntl.h>
  6. #include <time.h>
  7. #include <string.h>
  8. #include <stdint.h>
  9. #include <dirent.h>
  10. #include <limits.h>
  11. #include <stdlib.h>
  12. #include <inttypes.h>
  13. #include <errno.h>
  14. #include <sys/wait.h>
  15. #include <signal.h>
  16. #include <math.h>
  17. #include <sys/msg.h>
  18. #include <sys/shm.h>
  19. #include <sys/sem.h>
  20.  
  21. enum { N = 3 };
  22.  
  23. int
  24. get_class(unsigned ip)
  25. {
  26.     if (!(ip & (1U << 31))) {
  27.         return 0;
  28.     }
  29.     if (!(ip & (1U << 30))) {
  30.         return 1;
  31.     }
  32.     return 2;
  33. }
  34.  
  35. int
  36. main(int argc, char *argv[])
  37. {
  38.     int semid = semget(IPC_PRIVATE, N, 0666);
  39.     int shmid = shmget(IPC_PRIVATE, N * sizeof(unsigned), 0666);
  40.     unsigned *mas = shmat(shmid, NULL, 0), addr;
  41.     for (int i = 0; i < N; ++i) {
  42.         if (!fork()) {
  43.             while (!semop(semid, &(struct sembuf) {i, -1, 0}, 1)) {
  44.                 unsigned res;
  45.                 if (!i) {
  46.                     res = mas[i] % (1U << 24);
  47.                 } else if (i == 1) {
  48.                     res = mas[i] % (1U << 16);
  49.                 } else {
  50.                     res = mas[i] % (1U << 8);
  51.                 }
  52.                 printf("%d %x\n", i + 1, res);
  53.                 semop(semid, &(struct sembuf) {i, -1, 0}, 1);
  54.             }
  55.             shmdt(mas);
  56.             return 0;
  57.         }
  58.     }
  59.     while (scanf("%o", &addr) == 1) {
  60.         int num = get_class(addr);
  61.         mas[num] = addr;
  62.         semop(semid, &(struct sembuf) {num, 2, 0}, 1);
  63.         semop(semid, &(struct sembuf) {num, 0, 0}, 1);
  64.     }
  65.     shmdt(mas);
  66.     semctl(semid, N, IPC_RMID, NULL);
  67.     shmctl(shmid, IPC_RMID, NULL);
  68.     while (wait(NULL) > 0);
  69.  
  70.     return 0;
  71. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top