日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

UNIX再学习 -- 函数abort

發布時間:2025/3/15 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。