Advertisement
Guest User

Untitled

a guest
Dec 15th, 2019
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.99 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 Mess;
  20. char *eptr;
  21. key_t key = strtol(argv[1], &eptr, 10);
  22. int n = strtol(argv[2], &eptr, 10);
  23. long long maxval = strtol(argv[5], &eptr, 10);
  24. int msg = msgget(key, 0666 | IPC_CREAT | IPC_EXCL)ΠΆ
  25. pid_t *pid = calloc(n, sizeof(*pid));
  26. Mess.x[0] = strtol(argv[3], &eptr, 10);
  27. Mess.x[1] = strtol(argv[4], &eptr, 10);
  28. Mess.type = 1;
  29.  
  30. for(int i = 0; i < n; i++) {
  31. if ((pid[i] = fork()) == -1) {
  32. for(int i = 0; i < n; i++) {
  33. kill(pid[i], SIGKILL);
  34. }
  35. while (wait(NULL) != -1);
  36. msgctl(msg, IPC_RMID, 0);
  37. free(pid);
  38. _exit(1);
  39. }
  40. if (!pid[i]) {
  41. while (1) {
  42. if (msgrcv(msg, &Mess, sizeof(Mess.x), i + 1, 0) != -1) {
  43. free(pid);
  44. _exit(0);
  45. }
  46. long long x0 = Mess.x[0];
  47. Mess.x[0] = Mess.x[1];
  48. Mess.x[1] = x0 + Mess.x[1];
  49. printf("%d %lld\n", i, Mess.x[1]);
  50. fflush(stdout);
  51. if (Mess.x[1] > maxval) {
  52. for(int i = 0; i < n; i++) {
  53. kill(pid[i], SIGKILL);
  54. }
  55. free(pid);
  56. msgctl(msg, IPC_RMID, 0);
  57. _exit(0);
  58. } else {
  59. Mess.type = Mess.x[1] % n + 1;
  60. msgsnd(msg, &Mess, sizeof(Mess.x), 0);
  61. }
  62. }
  63. _exit(0);
  64. }
  65. }
  66. msgsnd(msg, &Mess, sizeof(Mess.x), 0);
  67. while(wait(NULL) != -1);
  68. msgctl(msg, IPC_RMID, 0);
  69. free(pid);
  70. return 0;
  71. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement