Advertisement
Guest User

Untitled

a guest
Dec 15th, 2019
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.02 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. pid[i] = fork();
  32. if ((pid[i] = fork()) == -1) {
  33. for(int i = 0; i < n; i++) {
  34. kill(pid[i], SIGKILL);
  35. }
  36. while (wait(NULL) != -1);
  37. msgctl(msg, IPC_RMID, 0);
  38. free(pid);
  39. _exit(1);
  40. }
  41. if (!pid[i]) {
  42. while (1) {
  43. if (msgrcv(msg, &Mess, sizeof(Mess.x), i + 1, 0) != -1) {
  44. free(pid);
  45. _exit(0);
  46. }
  47. long long x0 = Mess.x[0];
  48. Mess.x[0] = Mess.x[1];
  49. Mess.x[1] = x0 + Mess.x[1];
  50. printf("%d %lld\n", i, Mess.x[1]);
  51. fflush(stdout);
  52. if (Mess.x[1] > maxval) {
  53. for(int i = 0; i < n; i++) {
  54. kill(pid[i], SIGKILL);
  55. }
  56. free(pid);
  57. msgctl(msg, IPC_RMID, 0);
  58. _exit(0);
  59. } else {
  60. Mess.type = Mess.x[1] % n + 1;
  61. msgsnd(msg, &Mess, sizeof(Mess.x), 0);
  62. }
  63. }
  64. _exit(0);
  65. }
  66. }
  67. msgsnd(msg, &Mess, sizeof(Mess.x), 0);
  68. while(wait(NULL) != -1);
  69. msgctl(msg, IPC_RMID, 0);
  70. free(pid);
  71. return 0;
  72. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement