主進程在分發連接後,立即返回 `accept()` 調用,繼續阻塞於下一次 `accept()` 等待新連接,不會等待子進程處理完畢。
主進程 子進程1 子進程2
| | |
|--- accept() 阻塞等待 --------->| |
|<-- 返回 connfd (新連接) -------| |
| | |
|--- 發送 connfd 給子進程1 ----->| |
| | |
|--- accept() 再次阻塞等待 ----->| | ← 關鍵:立即循環下一次 accept
| |--- 處理連接 -->|
| | |
|<-- 返回 connfd (新連接) -------| |
|--- 發送 connfd 給子進程2 ----->| |
| | |--- 處理連接 -->
| | |
// 主進程主循環
while (running) {
int connfd = accept(listenfd, NULL, NULL); // 阻塞點 1
if (connfd < 0) { perror("accept"); continue; }
// 選擇空閒子進程 (簡化:輪詢)
int child_idx = get_idle_child();
send_fd(child_pipes[child_idx], connfd); // 阻塞點 2:若管道滿會阻塞,通常設非阻塞+select
close(connfd); // 主進程關閉引用,引用計數由子進程持有
}
主進程**不會**在子進程處理業務期間阻塞,它緊隨分發動作進入下一輪 `accept()`。這正是進程池模型實現高併發的核心:接收與處理解耦、並行化。