作者 yingfei [c] 2008-02-05 09:51 (点击下载)

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <signal.h>
  4. #include <sys/wait.h>
  5. #include <errno.h>
  6. #include <boss.h>
  7.  
  8. /* 子进程数量 */
  9. int forkflag;
  10. int _chldcnt;
  11.  
  12.  
  13.  
  14. int RequestAnalyze()
  15. {
  16. return(0);
  17. }
  18.  
  19. /* main function of children process */
  20. int process()
  21. {
  22. return(0);
  23. }
  24.  
  25. /* initialization of share parameters */
  26. int parentinit()
  27. {
  28. _chldcnt = 3;
  29. return(0);
  30. }
  31.  
  32. /* initialization of process only */
  33. int childinit()
  34. {
  35. return(0);
  36. }
  37.  
  38. int childfinal()
  39. {
  40. sleep(5);
  41. return 0;
  42. }
  43.  
  44. /**********************************************************/
  45. /* 固定进程控制模块 */
  46. /**********************************************************/
  47. void sig_quit(int signo)
  48. {
  49. _exit(0);
  50. }
  51.  
  52. void sig_exit(int signo)
  53. {
  54. kill(0, 15);
  55. _exit(0);
  56. }
  57.  
  58. void sig_chld(int signo)
  59. {
  60. pid_t pid;
  61. int stats, i;
  62.  
  63. while ( (pid = waitpid(-1, &stats, WNOHANG)) > 0) {
  64. CheckError("child %d terminated.\n", pid);
  65. for (i = 0; i < _chldcnt; i++)
  66. if (mychld[i].pid == pid) {
  67. mychld[i].flag = 1;
  68. forkflag = 1;
  69. break;
  70. }
  71. }
  72. }
  73.  
  74. int chlidrun(char bid)
  75. {
  76. bankid = bid;
  77. signal(SIGTERM, sig_quit);
  78. if (childinit()) CheckError("childinit error !!!\n");
  79. else if (process()) {
  80. CheckError("process error !!!\n");
  81. sleep(1);
  82. }
  83. childfinal();
  84. _exit(0);
  85. }
  86.  
  87. int prginit(int argc, char **argv)
  88. {
  89. if (parentinit()) exit(-1);
  90. signal(SIGCLD, SIG_IGN);
  91. signal(SIGCHLD, sig_chld);
  92. signal(SIGTERM, sig_exit);
  93. return(0);
  94. }
  95.  
  96. void newchild()
  97. {
  98. int pid, i;
  99.  
  100. signal(SIGCHLD, sig_chld);
  101. for (i = 0; i < _chldcnt; i++) {
  102. if (mychld[i].flag) {
  103. pid = fork();
  104. if (pid > 0) {
  105. mychld[i].pid = pid;
  106. mychld[i].flag = 0;
  107. }
  108. else if (pid == 0)
  109. chlidrun(mychld[i].bankid);
  110. else {
  111. i--;
  112. sleep(3);
  113. }
  114. }
  115. }
  116. forkflag = 0;
  117. }
  118.  
  119. int main(int argc, char **argv)
  120. {
  121. int i, pid;
  122.  
  123. if (argc != 3) {
  124. fprintf(stdout, "Usage: %s <config> <tracefile>\n",
  125. argv[0]);
  126. return(-1);
  127. }
  128. setpgrp();
  129. prginit(argc, argv);
  130. /* children fork */
  131. for (i = 0; i < _chldcnt; i++) {
  132. pid = fork();
  133. if (pid > 0) {
  134. mychld[i].pid = pid;
  135. mychld[i].flag = 0;
  136. }
  137. else if (pid == 0)
  138. chlidrun(mychld[i].bankid);
  139. else {
  140. i--;
  141. sleep(3);
  142. }
  143. usleep(100000);
  144. }
  145. forkflag = 0;
  146.  
  147. /* children management */
  148. signal(SIGCHLD, sig_chld);
  149. while(1) {
  150. if (forkflag)
  151. newchild();
  152. sleep(3);
  153. }
  154. return(0);
  155. }

提交下面的校正或者修改. (点击这里开始一个新的帖子)
姓名: 在 cookie 中记住我的名字

屏幕抓图:(jpeg 或 png)