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