主進程 accept 後發送 SIGUSR1 通知控制進程,高併發下信號可能合併/丟失,導致控制進程漏讀管道中的連接套接字。
Linux 標準信號不排隊:同一信號多次發送給進程,若進程正在處理該信號或信號被阻塞,後續信號會被丟棄(僅保留一個 pending)。
kill(control_pid, SIGRTMIN); // 替代 SIGUSR1
epoll 監聽管道讀端,完全避免信號。
// 主進程
write(pipe_fd[1], &conn_fd, sizeof(conn_fd));
// 控制進程 epoll 事件循環讀取 pipe_fd[0]
sigprocmask 解除阻塞)。採用 主進程 accept + epoll 分發 或 線程池,簡化信號處理。參考 經典進程池模型。