skaitiaozhan
2016-02-25 02:58
采纳率: 54.5%
浏览 1.9k
已采纳

进程池实现的多进程服务器问题

main函数中先实现进程池。主进程创建pipe管道,fork出一个子进程,作为控制进程,在控制进程中fork多个子进程作为业务处理进程,全部阻塞。
接着主进程开始socket一系列操作,在accept阻塞。
while(1){
connect_socket = accepet();
...
kill(control_pid,SIGUSR1);
}
现在我把connect_socket描述符通过pipe管道传给控制进程,通过控制进程去调度业务进程处理业务。
那么问题来了,我用signal SIGSUR1去通知控制进程任务到来。现在多个客户端几乎同时连接服务端,该如何实现控制进程接受任务取得pipe中的连接套接字而不重入导致部分任务被忽略?

我之前的做法是定义一个全局原子变量count,信号处理函数中++count,在控制进程中通过判断count与上次循环的值做比较判断任务是否到来。但是信号处理函数返回后如果立刻又接受到信号会导致任务忽略。
求大牛们帮忙给个更好的处理方案,原则是pipe管道的通信方式不变,因为通过共享内存实现的话我不需要控制进程调度业务进程了,主进程完全可以实现调度,现在需要解决的就是如何实现给控制进程发送信号无论什么情况下他都不会遗漏接收连接套字并且传输给业务进程通知处理。谢谢

不知道在算法层面能否解决这个问题,如果能解决的话更好了

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

5条回答 默认 最新

  • devmiao 2016-02-25 14:16
    已采纳
    打赏 评论
  • skaitiaozhan 2016-02-25 03:15

    不知道在算法层面能否解决这个问题,如果能解决的话更好

    打赏 评论
  • M醉清风Y 2016-02-25 03:45

    这块跟你是不是多进程没有关系,主要是消息队列。你可以主要看一下 消息队列。
    消息都获取到了 直接一个一个提取 该扔给哪个进程 或线程 都属于业务处理范畴了。

    打赏 评论
  • oyljerry 2016-02-25 14:14

    任务放一个队列 进程间只是通信让其它进程去队列取任务执行

    打赏 评论
  • devmiao 2016-02-25 14:15
    打赏 评论

相关推荐 更多相似问题