UNIX再学习 -- 函数abort
生活随笔
收集整理的這篇文章主要介紹了
UNIX再学习 -- 函数abort
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
abort 函數之前有講過的,參看:C語言再學習 -- 關鍵字return和exit ()函數
然后我們在講 8 中進程終止時,也說過。參看:UNIX再學習 -- exit 和 wait 系列函數
下面來詳細講一下它。
一、函數 abort
#include <stdlib.h> void abort(void); 此函數無返回值
1、函數功能
abort 函數的功能是使程序異常終止2、函數解析
abort 函數首先解除進程對 SIGABRT 信號的阻止,然后向調用進程發送該信號。abort 函數會導致進程的異常終止除非 SIGABRT 信號被捕捉并且信號處理句柄沒有返回。 如果 abort 函數導致進程終止,則所有打開的流都將關閉并刷新。 如果SIGABRT信號被忽略,或被返回的處理程序捕獲,則abort()函數仍將終止進程。 它通過恢復 SIGABRT 的默認配置,然后再次發送信號來做到這一點。3、abort 函數實現
#include <signal.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h>void abort(void) /* POSIX-style abort() function */ {sigset_t mask;struct sigaction action;/* Caller can't ignore SIGABRT, if so reset to default */sigaction(SIGABRT, NULL, &action);if (action.sa_handler == SIG_IGN) {action.sa_handler = SIG_DFL;sigaction(SIGABRT, &action, NULL);}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 ... */ }
4、函數實現解析
首先看是否將執行默認動作,若是則沖洗所有標準 I/O 流。這并不等價于對所有打開的流調用 fclose (因為只沖洗,并不關閉它們),但是當進程終止時,系統會關閉所有打開的文件。如果進程捕捉此信號并返回,那么因為進程可能產生了更多的輸出,所以再一次沖洗所有的流。不進行沖洗處理的唯一條件是如果進程捕捉此信號,然后調用 _exit 或 _Exit。這種情況下,任何未沖洗的內存中的標準 I/O 緩存都被丟棄。我們假定捕捉此信號,而且 _exit 或 _Exit 的調用者并不想要沖洗緩沖區。5、示例說明
//示例一 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <signal.h>void fa (int signo) {printf ("捕捉到了信號%d\n", signo); } int main (void) {signal (SIGABRT, fa);printf ("1111111111111\n");abort ();printf ("2222222222222\n");return 0; } 輸出結果: 1111111111111 捕捉到了信號6 已放棄 (核心已轉儲) //示例二 #include <stdio.h> #include <stdlib.h>int main () {FILE *fp;printf("準備打開 nofile.txt\n");fp = fopen( "nofile.txt","r" );if(fp == NULL){printf("準備終止程序\n");abort();}printf("準備關閉 nofile.txt\n");fclose(fp);return(0); } 輸出結果: 如果沒有 nofile.txt 文件則: 準備打開 nofile.txt 準備終止程序 已放棄 (核心已轉儲)6、示例解析
調用 abort 函數,發送 SIGABRT 信號;abort 將所有打開的流都將關閉并刷新。總結
以上是生活随笔為你收集整理的UNIX再学习 -- 函数abort的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机器学习笔记(三)——正则化最小二乘法
- 下一篇: 产品经理如何通过拆产品,持续提升产品能力