問題:服務端代碼中 while(1) { recvfrom(...); ... } 這樣的無限循環,什麼條件下應該跳出?
recvfrom/accept/epoll_wait),無請求時進程休眠,不消耗 CPU。SIGTERM(kill 默認)、SIGINT(Ctrl+C)、SIGHUP 等。在信號處理函數中設置全局標誌 volatile sig_atomic_t running = 0;,循環條件改為 while(running)。break,但屬於異常終止,需記錄日誌並觸發告警。volatile sig_atomic_t keep_running = 1;
void sig_handler(int sig) { keep_running = 0; }
int main() {
signal(SIGTERM, sig_handler);
signal(SIGINT, sig_handler);
while (keep_running) {
// recvfrom / epoll_wait 等阻塞調用
// 處理業務
}
// 清理資源:關閉 socket、釋放內存、關閉日誌
return 0;
}
總結:while(1) 循環本身不設計退出條件,退出由部署環境通過信號觸發。