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

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

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
    关注
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

悬赏问题

  • ¥15 ansys fluent计算闪退
  • ¥15 有关wireshark抓包的问题
  • ¥15 Ubuntu20.04无法连接GitHub
  • ¥15 需要写计算过程,不要写代码,求解答,数据都在图上
  • ¥15 向数据表用newid方式插入GUID问题
  • ¥15 multisim电路设计
  • ¥20 用keil,写代码解决两个问题,用库函数
  • ¥50 ID中开关量采样信号通道、以及程序流程的设计
  • ¥15 U-Mamba/nnunetv2固定随机数种子
  • ¥30 C++行情软件的tick数据如何高效的合成K线