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管道的通信方式不变,因为通过共享内存实现的话我不需要控制进程调度业务进程了,主进程完全可以实现调度,现在需要解决的就是如何实现给控制进程发送信号无论什么情况下他都不会遗漏接收连接套字并且传输给业务进程通知处理。谢谢
不知道在算法层面能否解决这个问题,如果能解决的话更好了