Guest User

Untitled

a guest
Dec 10th, 2018
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.13 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <signal.h>
  3. #include <stdlib.h>
  4. #include <unistd.h>
  5. #include <sys/wait.h>
  6.  
  7. int p[2];//pipe
  8.  
  9. void sigHandler (int sig) {
  10. char c;
  11. switch (sig) {
  12. case SIGUSR1:
  13. c = '1';
  14. break;
  15. case SIGUSR2:
  16. c = '2';
  17. break;
  18. case SIGALRM:
  19. c = '0';
  20. break;
  21. case SIGSTOP:
  22. exit (0);
  23. break;
  24. }
  25. write(p[1], &c, sizeof(char));
  26. }
  27.  
  28.  
  29. int main(int argc, char **argv) {
  30. int signals[3], sig, i;
  31. for (i=0; i< 3; i++) {
  32. signals[i] =0;
  33. }
  34. pid_t pid;
  35. char csig;
  36. pipe(p);
  37.  
  38. /*fork code*/
  39. pid = fork();
  40.  
  41. /*parent*/
  42. if (pid) {
  43. close(p[1]);
  44. int proceed = 1;
  45.  
  46. /*cycle keeps on indefinitely*/
  47. while (proceed) {
  48. sleep(15); //increased the time so I have time to send signals
  49. while (read(p[0], &csig, sizeof(char)) > 0) {
  50. sig=atoi(&csig);
  51. signals[sig]++;
  52.  
  53. /*if alternating sigals, error*/
  54. if (signals[1] && signals[2]) {
  55. printf("Error: alternating SIGUSR1 and SIGUSR2n%dt%dn", signals[1], signals[2]);
  56.  
  57. }
  58. /*if 2 consecutive signals, success*/
  59. if (signals[sig] == 2) {
  60. printf("Success: two consecutive SIGUSR1 or SIGUSR2n");
  61. }
  62. /*if three consecutive signals, exit*/
  63. if (signals[sig] == 3) {
  64. kill(pid, SIGSTOP);
  65. proceed = 0;
  66. break;
  67. }
  68. /*make 0 any non repeating signal != sig*/
  69. for(i = 0; i< 3; i++) {
  70. if (i != sig) {
  71. signals[i] = 0;
  72. }
  73. }
  74. }
  75. }
  76. /*child*/
  77. } else {
  78. close(p[0]);
  79. signal(SIGUSR1, sigHandler);
  80. signal(SIGUSR2, sigHandler);
  81. signal(SIGALRM, sigHandler);
  82. signal(SIGSTOP, sigHandler);
  83. while (1) {
  84. sleep(5); //no need to do anything else
  85. }
  86. exit(1);
  87.  
  88. }
  89. return 0;
  90. }
Add Comment
Please, Sign In to add comment