#include <stdlib.h> // 必須包含
void exit(int status);
status = 0 或 EXIT_SUCCESS:表示 **正常終止**。status ≠ 0 或 EXIT_FAILURE:表示 **異常終止**,具體值可由呼叫端(Shell 腳本、父進程)檢測。| 特性 | exit() | return (在 main 中) |
|---|---|---|
| 作用範圍 | **立即終止整個進程** | 僅返回 main,由啟動代碼呼叫 exit |
| 清理動作 | 執行 atexit 登記函數、刷新標準 I/O 緩衝區、關閉流、臨時檔案刪除 | 同上(因最終會呼叫 exit) |
| 遞歸調用中 | 直接跳出所有層級回到系統 | 逐層返回上一級函數 |
| 典型用途 | 嚴重錯誤無法恢復、子進程異常退出 | 正常流程結束 |
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)
}
void cleanup() { puts("Cleaning up resources..."); }
int main() {
atexit(cleanup); // 程式正常退出時自動調用
// ...
return 0;
}
可註冊多個,按 **反序** 執行(後進先出)。
#include <stdlib.h>。exit(0) 正常退出,exit(非零) 異常退出,供腳本判斷。return 結束 main;不可恢復錯誤用 exit。exit 會自動完成 fclose 等清理,但顯式關閉資源是良好習慣。