UNIX再學習 函式abort

2021-07-31 18:27:04 字數 2161 閱讀 2334

abort 函式之前有講過的,參看:c語言再學習 -- 關鍵字return和exit ()函式

然後我們在講 8 中程序終止時,也說過。參看:unix再學習 -- exit 和 wait 系列函式

下面來詳細講一下它。

#include void abort(void);

此函式無返回值

abort 函式的功能是使程式異常終止

abort 函式首先解除程序對 sigabrt 訊號的阻止,然後向呼叫程序傳送該訊號。abort 函式會導致程序的異常終止除非 sigabrt 訊號**捉並且訊號處理控制代碼沒有返回。

如果 abort 函式導致程序終止,則所有開啟的流都將關閉並重新整理。

如果sigabrt訊號被忽略,或被返回的處理程式捕獲,則abort()函式仍將終止程序。 它通過恢復 sigabrt 的預設配置,然後再次傳送訊號來做到這一點。

#include #include #include #include void

abort(void) /* posix-style abort() function */

if (action.sa_handler == sig_dfl)

fflush(null); /* flush all open stdio streams */

/* caller can't block sigabrt; make sure it's unblocked */

sigfillset(&mask);

sigdelset(&mask, sigabrt); /* mask has only sigabrt turned off */

sigprocmask(sig_setmask, &mask, null);

kill(getpid(), sigabrt); /* send the signal */

/* if we're here, process caught sigabrt and returned */

fflush(null); /* flush all open stdio streams */

action.sa_handler = sig_dfl;

sigaction(sigabrt, &action, null); /* reset to default */

sigprocmask(sig_setmask, &mask, null); /* just in case ... */

kill(getpid(), sigabrt); /* and one more time */

exit(1); /* this should never be executed ... */

}

首先看是否將執行預設動作,若是則沖洗所有標準 i/o 流。這並不等價於對所有開啟的流呼叫 fclose (因為只沖洗,並不關閉它們),但是當程序終止時,系統會關閉所有開啟的檔案。

如果程序捕捉此訊號並返回,那麼因為程序可能產生了更多的輸出,所以再一次沖洗所有的流。不進行沖洗處理的唯一條件是如果程序捕捉此訊號,然後呼叫 _exit 或 _exit。這種情況下,任何未沖洗的記憶體中的標準 i/o 快取都被丟棄。我們假定捕捉此訊號,而且 _exit 或 _exit 的呼叫者並不想要沖洗緩衝區。

//示例一

#include #include #include #include void fa (int signo)

int main (void)

輸出結果:

1111111111111

捕捉到了訊號6

已放棄 (核心已轉儲)

//示例二

#include #include int main ()

printf("準備關閉 nofile.txt\n");

fclose(fp);

return(0);

}輸出結果:

如果沒有 nofile.txt 檔案則:

準備開啟 nofile.txt

準備終止程式

已放棄 (核心已轉儲)

呼叫 abort 函式,傳送 sigabrt 訊號;abort 將所有開啟的流都將關閉並重新整理。

UNIX再學習 傳送訊號

傳送訊號的方式有幾種 sigint 2 ctrl c 中斷符 sigquit 3 ctrl 退出符 sigtstp 20 ctrl z 停止符 sigill 4 程序試圖執行非法指令 sigbus 7 硬體或對齊錯誤 sigfpe 8 算術異常 sigsegv 11 無法記憶體訪問 sigpipe ...

分析函式再學習 統計函式

學習資料 url 求總計可以用到的函式rollup select t.deptno,sum t.sal from emp t group by rollup t.deptno 求百分比 select e.empno,e.ename,e.deptno,e.sal,ratio to report e.s...

虛函式表再學習

測試環境 編譯器gcc,環境win7,64位系統 參考 結論 1.虛函式指標儲存在類其他成員之前 2.基類的虛函式表 子類的虛函式表是分別存放的 3.子類虛函式表中儲存的內容依次為 繼承自基類的虛函式 按宣告順序存放 子類自己的虛函式 按宣告順序存放 4.即使子類沒有自己的虛函式,他仍然會建立乙個虛...