Advertisement
Guest User

Untitled

a guest
Dec 9th, 2019
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.57 KB | None | 0 0
  1. #include <unistd.h>
  2. #include <sys/types.h>
  3. #include <sys/ipc.h>
  4. #include <sys/wait.h>
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <sys/sem.h>
  8. #include <sys/shm.h>
  9.  
  10. int main(int argc, char *argv[])
  11. {
  12.     int count, key, max_val;
  13.     sscanf(argv[1], "%d", &count);
  14.     key = (int) strtol(argv[2], NULL, 16);
  15.     sscanf(argv[3], "%d", &max_val);
  16.  
  17.     int semid = semget(key, count, 0666 | IPC_CREAT);
  18.     int shmid = shmget(key, 2 * sizeof(int), 0666 | IPC_CREAT);
  19.     int *num = (int *) shmat(shmid, NULL, 0);
  20.     num[0] = 0;
  21.     num[1] = 0;
  22.     for (int i = 0; i < count; i++) {
  23.         pid_t pid = fork();
  24.         if (pid < 0) {
  25.             _exit(1);
  26.         } else if (pid == 0) {
  27.             while (1) {
  28.                 int s = semop(semid, &(struct sembuf) {.sem_num = i, .sem_op = -1, .sem_flg = 0}, 1);
  29.                 if (s < 0) {
  30.                     exit(0);
  31.                 }
  32.                 printf("%d %d %d\n", i + 1, num[0], num[1]);
  33.                 fflush(stdout);
  34.                 num[0] += 1;
  35.                 if (num[0] > max_val) {
  36.                     semctl(semid, 0, IPC_RMID);
  37.                     exit(0);
  38.                 }
  39.                 int tmp_num = (num[0] * num[0] * num[0] * num[0]) % count;
  40.                 num[1] = i + 1;
  41.                 semop(semid, &(struct sembuf) {.sem_num = tmp_num, .sem_op = 1, .sem_flg = 0}, 1);
  42.             }
  43.         }
  44.     }
  45.     semop(semid, &(struct sembuf) {.sem_num = 0, .sem_op = 1, .sem_flg = 0}, 1);
  46.     while (wait(NULL) > 0) {}
  47.     semctl(semid, 0, IPC_RMID);
  48.     shmctl(shmid, 0, IPC_RMID);
  49. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement