Advertisement
Guest User

Untitled

a guest
Dec 15th, 2019
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.81 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <errno.h>
  4. #include <sys/types.h>
  5. #include <sys/ipc.h>
  6. #include <sys/msg.h>
  7. #include <signal.h>
  8. #include <sys/wait.h>
  9. #include <unistd.h>
  10.  
  11. struct Message
  12. {
  13.     long type;
  14.     long long x[2];
  15. };
  16.  
  17. int main(int argc, char *argv[])
  18. {
  19.     struct Message mesg;
  20.     int key = strtol(argv[1], NULL, 10);
  21.     int msg = msgget(key, 0666 | IPC_CREAT);
  22.     int n = strtol(argv[2], NULL, 10);
  23.     long long maxval = strtol(argv[5], NULL, 10);
  24.     int *pid = calloc(n, sizeof(*pid));
  25.     mesg.x[0] = strtol(argv[3], NULL, 10);
  26.     mesg.x[1] = strtol(argv[4], NULL, 10);
  27.     mesg.type = 1;
  28.  
  29.     for(int i = 0; i < n; i++) {
  30.         if ((pid[i] = fork()) == -1) {
  31.             for(int j = 0; j < i; i++) {
  32.                 kill(pid[j], SIGKILL);
  33.             }
  34.             while (wait(NULL) != -1);
  35.             msgctl(msg, IPC_RMID, 0);
  36.             free(pid);
  37.             _exit(1);
  38.         }
  39.         if (!pid[i]) {
  40.             while (1) {
  41.                 if (msgrcv(msg, &mesg, sizeof(mesg.x), i + 1, 0) == -1) {
  42.                     free(pid);
  43.                     _exit(0);
  44.                 }
  45.                 long long x0 = mesg.x[0];
  46.                 mesg.x[0] = mesg.x[1];
  47.                 mesg.x[1] = x0 + mesg.x[1];
  48.                 printf("%d %lld\n", i, mesg.x[1]);
  49.                 fflush(stdout);
  50.                 if (mesg.x[1] > maxval) {
  51.                     msgctl(msg, IPC_RMID, 0);
  52.                     _exit(0);
  53.                 } else {
  54.                     mesg.type = mesg.x[1] % n + 1;
  55.                     msgsnd(msg, &mesg, sizeof(mesg.x), 0);
  56.                 }
  57.             }
  58.             _exit(0);
  59.         }
  60.     }
  61.     msgsnd(msg, &mesg, sizeof(mesg.x), 0);
  62.     while(wait(NULL) != -1);
  63.     msgctl(msg, IPC_RMID, 0);
  64.     free(pid);
  65.     return 0;
  66. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement