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

Linux C編程:進程退出函數族詳解(exit/_exit/atexit/abort)

     編輯:關於C語言

退出相關函數速查表

函數頭文件用途關鍵差異
exit(status)stdlib.h正常終止,刷新 I/O 緩衝區,調用 atexit 登記函數標準庫函數,確保資料落盤
_exit(status)unistd.h直接進入內核終止,不刷新緩衝區,不調用 atexit系統調用,適用 fork 後子進程錯誤退出
atexit(func)stdlib.h登記無參數清理函數,正常退出時按逆序調用最多 32 個,返回 0 成功
on_exit(func, arg)stdlib.h登記帶參數清理函數(已棄用,保留兼容)參數含退出狀態與用戶參數
abort()stdlib.h發送 SIGABRT 異常終止,產生 core dump不調用任何清理函數
assert(expr)assert.h宏,expr 為假時輸出訊息並 abort定義 NDEBUG 可禁用

緩衝 I/O 與 exit/_exit 差異實測

/* exit_demo.c */
#include <stdio.h>
#include <stdlib.h>
int main() {
    printf("Using exit...\n");
    printf("This is the content in buffer");  // 無換行,留在緩衝區
    exit(0);
}

/* _exit_demo.c */
#include <stdio.h>
#include <unistd.h>
int main() {
    printf("Using _exit...\n");
    printf("This is the content in buffer");
    _exit(0);
}

結果:exit 版本輸出兩行;_exit 版本僅輸出第一行(緩衝區未刷新)。

僵屍進程與 exit

調用 exit 後,進程不會立即消失,而是留下僵屍進程(Zombie),佔用極少資源,僅保留退出狀態供父進程 wait 收集。父進程未收集會導致僵屍累積。

選擇建議

  • 正常主程式退出:exit()。
  • fork() 後子進程出錯需立即退出:_exit()(避免雙重刷新標準輸出)。
  • 嚴重錯誤需 core dump 分析:abort()。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved