关于进程池的疑惑

http://blog.csdn.net/guosha/archive/2009/02/10/3874998.aspx

最近在学多进程和多线程。看到上面的关于进程池的解决办法再加上老师的介绍,觉得有点不解。为什么进程池要用一个管理进程进行任务的分配而不是由子进程自己从消息队列中提取任务,主进程只是将任务入队列呢?我自己把一个网络服务端的程序改了一下,试了试,可以调试通过,只是不知道这样有什么问题。

/*************************************************

创建10个进程

*************************************************/

 do
 {
    pt[i] = fork();
 }while(pt[i-1] > 0 && i < 10);

 

/**********************************************************

主进程负责监视stdin和socket文件描述符

**********************************************************/

 if(pt[9] > 0) //主进程,也是任务加载进程

 {
   while(RUNNING)
   {
      ret = select(maxfd + 1, &readfds, NULL, NULL, &tv);  //select, 对io进行反应,等待tv秒
      switch(ret)
      {
        case -1:     //函数出错
          if(errno == EINTR)
          continue;
          Err_sys("Server select")
        case 0:      //没有输入
          continue;
        default:
          if(FD_ISSET(0, &readfds))            //服务器发送消息
          {   
            fgets(buffer_w, BUFFERSIZE, stdin);  
            wc = send(newfd, buffer_w, strlen(buffer_w), 0);
          }//send

/************************************************************

如果有连接请求就放入消息队列中,让资源进程去提取

************************************************************/
          if(FD_ISSET(sockfd, &readfds))
          {  
             msg.mtype = sockfd;       
             msgsnd(msgid, &msg, 0, 0);    //将任务送入队列中,让子进程执行
          }
      }//switch

   } //while            
 }

/***********************************************************

资源进程,负责对每个连接请求进行接收并打印

***********************************************************/
 else  //child process
 {
   int fd;
   printf("I am ready/n");
   while(RUNNING)
   {

/***********************************************************

等候消息队列中的消息,一有任务就进行处理

***********************************************************/
     msgrcv(msgid, &msg, 0, 0, 0);
     fd = msg.mtype; 
     newfd = accept(fd, (struct sockaddr *)&client_addr, &addrlen);    //接受连接
    while(RUNNING)       //执行任务
     {
       memset(buffer_r, '/0', BUFFERSIZE);
       rc = recv(newfd, buffer_r, BUFFERSIZE, 0);
       if(rc <= 0)
       {

/****************************************************************

客户一断开就跳出任务循环回去等待新的任务

****************************************************************/
         if(rc == 0)
         { 
          printf("Client has been closed/n");
         }
         close(newfd);
         break;                   //跳出任务
       } 
       else
         printf("[Server recv]:%s/n", buffer_r);           //打印接收到的消息
     }
   }
 }

 

这里将很多代码省掉了,只是大概的描述了一下自己的想法和实现,不能运行。希望大家多多指教!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值