首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Socket 服務端 while(1) 循環何時結束?通常不結束,由外部信號控制

     編輯:程式設計疑難解答

問題:服務端代碼中 while(1) { recvfrom(...); ... } 這樣的無限循環,什麼條件下應該跳出?

標準架構認知

  • 服務端本質是長運行進程,設計目標是持續監聽、處理客戶端請求。
  • 循環體內通常為 阻塞式 I/O(recvfrom/accept/epoll_wait),無請求時進程休眠,不消耗 CPU。
  • 正常業務邏輯不應主動跳出循環,否則服務不可用。

退出機制:外部信號控制

  1. 系統信號:SIGTERM(kill 默認)、SIGINT(Ctrl+C)、SIGHUP 等。在信號處理函數中設置全局標誌 volatile sig_atomic_t running = 0;,循環條件改為 while(running)。
  2. 管理命令:Systemd、Supervisor、Kubernetes 等進程管理工具發送信號實現優雅停機。
  3. 內部控制:極少數場景(如配置熱更失敗、核心資源耗盡)可主動 break,但屬於異常終止,需記錄日誌並觸發告警。
  4. 代碼模板

    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) 循環本身不設計退出條件,退出由部署環境通過信號觸發。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved