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.即使子類沒有自己的虛函式,他仍然會建立乙個虛...