Guest User

Untitled

a guest
Dec 19th, 2018
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.19 KB | None | 0 0
  1. add job 12987
  2. add job 12988
  3. Wed Dec 19 22:20:59 CST 2018
  4. del from 12987
  5. Wed Dec 19 22:21:00 CST 2018
  6. del from 12988
  7. add job 12989
  8. add job 12990
  9. del from 12989
  10. Wed Dec 19 22:21:01 CST 2018
  11. add job 12991
  12. Wed Dec 19 22:21:02 CST 2018
  13. del from 12990
  14. Wed Dec 19 22:21:03 CST 2018
  15. del from 12991
  16.  
  17. add job 12987
  18. add job 12988
  19. Wed Dec 19 22:20:59 CST 2018
  20. del from 12987
  21. now the list is: 12988
  22. Wed Dec 19 22:21:00 CST 2018
  23. del from 12988
  24. now the list is:
  25. add job 12989
  26. add job 12990
  27. Wed Dec 19 22:21:01 CST 2018
  28. add job 12991
  29. Wed Dec 19 22:21:02 CST 2018
  30. add job 12992
  31. Wed Dec 19 22:21:03 CST 2018
  32. add job 12993
  33. Wed Dec 19 22:21:04 CST 2018
  34. add job 12994
  35. Wed Dec 19 22:21:05 CST 2018
  36. add job 13091
  37. Wed Dec 19 22:21:06 CST 2018
  38. add job 13092
  39. Wed Dec 19 22:21:07 CST 2018
  40. Wed Dec 19 22:21:08 CST 2018
  41.  
  42. #include "apue.h"
  43. #include <sys/wait.h>
  44. #include <sys/signal.h>
  45. #include <errno.h>
  46.  
  47. void printJobs();
  48. void addJob(int);
  49. void delJob();
  50.  
  51. void handler(int sig)
  52. {
  53. sigset_t mask_all, pre_all;
  54. sigfillset(&mask_all); // fill all bits of the mask
  55. pid_t pid;
  56. while ((pid = waitpid(-1, NULL, 0)) > 0) {
  57. sigprocmask(SIG_BLOCK, &mask_all, &pre_all);
  58. printf("del from %dn", pid);
  59. delJob(pid);
  60. sigprocmask(SIG_UNBLOCK, &pre_all, NULL);
  61. }
  62. if (errno != ECHILD)
  63. printf("waitpid errorn");
  64. }
  65.  
  66. int main(int argc, char **argv)
  67. {
  68. pid_t pid;
  69. sigset_t mask_all, mask_one, pre_one;
  70.  
  71. sigfillset(&mask_all);
  72. sigemptyset(&mask_one);
  73. sigaddset(&mask_one, SIGCHLD);
  74. signal(SIGCHLD, handler);
  75. for (int i = 0; i < 10; ++i) {
  76. sigprocmask(SIG_BLOCK, &mask_one, &pre_one); // block SIGCHLD
  77. if ((pid = fork()) == 0) {
  78. sigprocmask(SIG_SETMASK, &pre_one, NULL);
  79. sleep(1);
  80. execve("/bin/date", argv, NULL);
  81. }
  82. sigprocmask(SIG_BLOCK, &mask_all, NULL); // block all sigals
  83. addJob(pid);
  84. sigprocmask(SIG_SETMASK, &pre_one, NULL); // unblock SIGCHLD
  85. sleep(1);
  86. }
  87. exit(0);
  88. }
  89.  
  90. typedef struct Node {
  91. int val;
  92. struct Node *next;
  93. } Node, *pNode;
  94.  
  95. pNode phead = NULL, ptail = NULL;
  96.  
  97. void printJobs()
  98. {
  99. pNode pt = phead;
  100. while (pt) {
  101. printf("%d", pt->val);
  102. pt = pt->next;
  103. }
  104. printf("n");
  105. }
  106.  
  107. void delJob(int pid)
  108. {
  109. if (ptail) {
  110. pNode pt = phead, pre = NULL;
  111. while (pt && pt->val != pid) {
  112. pre = pt;
  113. pt = pt->next;
  114. }
  115. if (!pt) {
  116. printf("No job %dn", pid);
  117. return;
  118. }
  119. if (pt == phead) { // only have one node or empty
  120. phead = phead->next ? phead->next : NULL;
  121. free(pt);
  122. ptail = phead ? ptail : NULL;
  123. } else { // have more than one nodes
  124. printf("del %dn", pt->val);
  125. free(pt);
  126. pre->next = NULL;
  127. ptail = pt == ptail ? pre : ptail;
  128. }
  129. printf("now the list is: ");
  130. printJobs();
  131. } else {
  132. printf("No job %dn", pid);
  133. }
  134. }
  135.  
  136. void addJob(int pid)
  137. {
  138. printf("add job %dn", pid);
  139. pNode pt = malloc(sizeof(Node));
  140. pt->val = pid;
  141. pt->next = NULL;
  142. if (!phead) {
  143. phead = ptail = pt;
  144. } else {
  145. ptail->next = pt;
  146. ptail = pt;
  147. }
  148. }
Add Comment
Please, Sign In to add comment