複製鏈接
請複製以下鏈接發送給好友

abort

(計算機術語)

鎖定
abort是一個計算機術語,函數功能是異常終止一個進程,中止當前進程,返回一個錯誤代碼。
中文名
abort
概    述
引發不正常進程的終止
頭文件
#include
功 能
異常終止一個進程
性    質
函數名

abort函數簡介

函數名: abort
頭文件:#include <stdlib.h>
功 能: 異常終止一個進程。中止當前進程,返回一個錯誤代碼。錯誤代碼的缺省值是3。
該函數產生SIGABRT信號併發送給自己,默認情況下導致程序終止不成功的終止錯誤代碼返回到主機環境。
自動或靜態存儲持續時間的對象,而無需調用任何atexit函數,析構函數不執行程序終止。函數永遠不會返回到其調用者。
用 法: void abort(void);

abort舉例

程序例:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
printf("Calling abort()\n");
abort();
return 0; /* This is never reached */
}

abort注意事項

因為調用abort()而終止,那麼是因為某些條件成立,而用户不得不作出終止當前進程的決定(參考assert()),abort()行為本身並不異常,如果用户調用了,那麼進程就終止,完全是預期的行為。原理上來説,abort通過給自己發送SIGABRT信號,然後kernel會殺掉自己,並coredump。但是,如果用户重新定義了SIGABRT信號的行為呢?
#include<stdlib.h>
#include<signal.h>
#include<stdio.h>
#include<assert.h>
voidhandler(inti)
{
<a href="#" data-lemmaid="7467706">printf</a>("catchsignal\n");
}
intmain()
{
signal(SIGABRT,<a href="#" data-lemmaid="10404534">handler</a>);
abort();
<a href="#" data-lemmaid="755564">while</a>(1);/*Thisisneverreached*/
return0;
}

結果是,會打印"catch signal",然後還是coredump了。原因是:abort()函數里面先給自己發送SIGABRT保證handler執行,然後再重新註冊了SIGABRT,會修改成默認行為,再次給自己發送SIGABRT,保證執行默認行為,coredump。同時,還會flush所有打開的文件,然後關閉掉。