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

C語言 exit() 函數深度解析:正常退出、異常退出與資源清理

     編輯:C 語言問答

基本語法與頭檔

#include <stdlib.h>  // 必須包含
void exit(int status);
  • status = 0 或 EXIT_SUCCESS:表示 **正常終止**。
  • status ≠ 0 或 EXIT_FAILURE:表示 **異常終止**,具體值可由呼叫端(Shell 腳本、父進程)檢測。

exit() vs return:本質區別

特性exit()return (在 main 中)
作用範圍**立即終止整個進程**僅返回 main,由啟動代碼呼叫 exit
清理動作執行 atexit 登記函數、刷新標準 I/O 緩衝區、關閉流、臨時檔案刪除同上(因最終會呼叫 exit)
遞歸調用中直接跳出所有層級回到系統逐層返回上一級函數
典型用途嚴重錯誤無法恢復、子進程異常退出正常流程結束

exit() 與 fclose() 的關係

  • fclose(fp):僅關閉指定流,釋放緩衝區,**不終止程式**。
  • exit():會 **自動關閉所有打開的流**(相當於對每個流呼叫 fclose),然後移交控制權給作業系統。
  • **最佳實踐**:正常流程用 fclose 顯式關閉檔案,錯誤處理路徑可直接 exit 讓系統統一收尾。

實戰範例:健壯的檔案處理模板

#include <stdio.h>
#include <stdlib.h>

int main() {
    FILE *fp = fopen("data.txt", "r");
    if (!fp) {
        perror("Open failed");  // 輸出系統錯誤訊息
        exit(EXIT_FAILURE);     // 非零退出碼
    }

    // ... 處理檔案 ...

    if (fclose(fp) != 0) {      // 顯式關閉並檢查
        perror("Close failed");
        exit(EXIT_FAILURE);
    }
    return EXIT_SUCCESS;        // 等同 exit(0)
}

進階:atexit 註冊清理函數

void cleanup() { puts("Cleaning up resources..."); }

int main() {
    atexit(cleanup);  // 程式正常退出時自動調用
    // ...
    return 0;
}

可註冊多個,按 **反序** 執行(後進先出)。

總結

  • **必須** #include <stdlib.h>。
  • exit(0) 正常退出,exit(非零) 異常退出,供腳本判斷。
  • 優先用 return 結束 main;不可恢復錯誤用 exit。
  • exit 會自動完成 fclose 等清理,但顯式關閉資源是良好習慣。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved