Advertisement
Tavi33

SO #7

Nov 15th, 2016
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.02 KB | None | 0 0
  1. #include <signal.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5. double old_val = 0;
  6. double val = 0;
  7. double r = 0;
  8.  
  9. int pos = 0;
  10.  
  11. int child_pid;
  12.  
  13. int counter = 0;
  14.  
  15. void child_end(int sig)
  16. {
  17. printf("Child %d has ended. Exit code: %d\n", child_pid, sig);
  18. exit(0);
  19. }
  20.  
  21. void print_value(int sig)
  22. {
  23. printf("Value: %f\n", val);
  24. counter++;
  25. if(counter == 2)
  26. {
  27. exit(15);
  28. }
  29. }
  30.  
  31. void child_proc() {
  32. struct sigaction sig;
  33. sig.sa_handler = print_value;
  34. sig.sa_flags = 0;
  35. sigaction(SIGUSR1, &sig, NULL);
  36.  
  37. printf("Child process started.\n");
  38.  
  39.  
  40. while(1)
  41. {
  42. val = old_val + (1/r);
  43. old_val = val;
  44. }
  45.  
  46. }
  47.  
  48. void print_main(int sig)
  49. {
  50. printf("ALARM\n");
  51. kill(child_pid,SIGUSR1);
  52. if(pos == 3) pos = 0;
  53. switch(pos)
  54. {
  55. case 0: {
  56. printf("****\n");
  57. break;
  58. }
  59. case 1: {
  60. printf("++++\n");
  61. break;
  62. }
  63. case 2: {
  64. printf("----\n");
  65. break;
  66. }
  67. default: break;
  68. }
  69. pos++;
  70. }
  71.  
  72. void parent_proc()
  73. {
  74. printf("Parent process started.\n");
  75.  
  76. while(1)
  77. {
  78. //alarm outside of while
  79. alarm(1);
  80. }
  81. }
  82.  
  83. int main(int argc, char *args[]) {
  84. struct sigaction sig;
  85. sig.sa_handler = child_end;
  86. sig.sa_flags = 0;
  87. sigemptyset (&sig.sa_mask);
  88. if(sigaction(SIGCHLD, &sig, NULL) < 0)
  89. {
  90. printf("Error setting handler for SIGCHLD.\n");
  91. exit(0);
  92. }
  93.  
  94. struct sigaction mainsa;
  95. mainsa.sa_handler = print_main;
  96. mainsa.sa_flags = 0;
  97. sigemptyset (&mainsa.sa_mask);
  98. if(sigaction(SIGALRM, &mainsa, NULL) < 0)
  99. {
  100. printf("Error setting handler for SIGALRM.\n");
  101. exit(0);
  102. }
  103.  
  104. if(argc != 3)
  105. {
  106. fprintf(stderr, "Usage: %s <a0> <r>\n", args[0]);
  107. exit(1);
  108. }
  109.  
  110. old_val = atof(args[1]);
  111. r = atof(args[2]);
  112.  
  113. if ((child_pid = fork()) < 0)
  114. {
  115. printf("Error creating child process\n");
  116. exit(1);
  117. }
  118. if (child_pid == 0)
  119. {
  120. child_proc();
  121. exit(0);
  122. } else
  123. {
  124. //signals here
  125. parent_proc();
  126. }
  127. exit(0);
  128.  
  129. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement