一、观察者和工作者
对进程进行管理。父进程作为观察者,负责启动和监听工作者进程
程序文件:server.c
行:970~996
源代码:
代码1
- /* start watcher and workers */
- num_childs = srv->srvconf.max_worker;
- if (num_childs > 0) {
- int child = 0;
- while (!child && !srv_shutdown) {
- if (num_childs > 0) {
- switch (fork()) {
- case -1:
- return -1;
- case 0:
- child = 1;
- break;
- default:
- num_childs--;
- break;
- }
- } else {
- int status;
- /* ignore EINTR */
- if (-1 != wait(&status)) num_childs++;
- }
- }
- if (srv_shutdown) {
- kill(0, SIGTERM);
- }
- if (!child) return 0;
- }
抽取解析
以下代码1-1将代码1抽取出来
代码1-1
- #include <stdlib.h>
- #include <stdio.h>
- #include <unistd.h>
- #include <sys/types.h>
- /**
- * 进程管理
- * 进程的开启和进程的维护,包括关闭
- *
- * */
- int main(int argc,char** argv)
- {
- //是否子进程的标志
- int is_child=0;
- //服务退出标志
- int is_server_close=0;
- int ppid=0;
- int cid=0;
- //最大进程数
- int max_child_count=5;
- //is_child=0用来判断是否父进程,只有父进程才能进入此循环
- while(0==is_child && 0==is_server_close)//父进程执行此代码
- {
- //是否还有进程要创建
- if(max_child_count>0)
- {
- cid=fork();
- switch(cid)
- {
- //错误
- case -1:
- {
- printf("fork process=%d error/n",max_child_count);
- return -1;
- }
- //子进程
- case 0:
- {
- is_child=1;
- break;
- }
- //父进程
- default:
- {
- //创建子进程成功
- //进程数减少
- --max_child_count;
- printf("sub process id =%d/n",cid);
- printf("parent printf is_child value:%d/n",is_child);
- break;
- }
- }
- //所有进程都创建完毕
- }else
- {
- int status;
- //开始阻塞等待子进程是否结束
- if(-1!=wait(&status))
- {
- //结束,将进程数累加1,使循环可以重新启动新的进程
- max_child_count++;
- }
- }
- }
- //父进程结束维护子进程后的处理
- if(is_child==0)
- {
- printf("parent end/n");
- return 0;
- //子进程业务处理
- }else{
- sleep(5);
- printf("child id=%d end/n",cid);
- return 0;
- }
- }