2 skaitiaozhan skaitiaozhan 于 2016.02.25 10:58 提问

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

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
devmiao   Ds   Rxr 2016.02.25 22:16
已采纳
skaitiaozhan
skaitiaozhan 做这个server陆陆续续出现了很多问题,这种传递fd的方式不可取,这位答主在我的另一问中给予了解答,非常感谢
一年多之前 回复
skaitiaozhan
skaitiaozhan   2016.02.25 11:15

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

mengyin521
mengyin521   2016.02.25 11:45

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

skaitiaozhan
skaitiaozhan 因为获取服务的频率是随机的,安排给控制进程的工作是来一个任务分发一个任务,但是任务分发中可能会遗漏。我想了想还是直接让控制进程跑while(1)好了,谢谢了
接近 2 年之前 回复
devmiao
devmiao   Ds   Rxr 2016.02.25 22:15
oyljerry
oyljerry   Ds   Rxr 2016.02.25 22:14

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

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!