国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 操作系統(tǒng) > 正文

信號(hào)之a(chǎn)bort函數(shù)

2024-06-28 13:28:26
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
信號(hào)之a(chǎn)bort函數(shù)

abort函數(shù)的功能是使異常程序終止。

#include <stdlib.h>void abort(void);此函數(shù)不返回

此函數(shù)將SIGABRT信號(hào)發(fā)送給調(diào)用進(jìn)程(進(jìn)程不應(yīng)忽略此信號(hào))。ISO C規(guī)定,調(diào)用abort將向主機(jī)環(huán)境遞送一個(gè)未成功的終止通知,其方法是調(diào)用raise(SIGABRT)函數(shù)。

實(shí)例

程序清單10-18 abort的POSIX.1實(shí)現(xiàn)

#include <signal.h>#include <stdio.h>#include <stdlib.h>#include <unistd.h>voidabort(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 */    sigPRogmask(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 ... */}

首先查看是否執(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緩沖區(qū)都被丟棄。

如果調(diào)用kill使其為調(diào)用者產(chǎn)生信號(hào),并且如果該信號(hào)是不被阻塞的(程序清單10-18保證做到這一點(diǎn)),則在kill返回前,該信號(hào)(或某個(gè)未決、未阻塞的信號(hào))就被傳送給了該進(jìn)程(http://www.CUOXin.com/nufangrensheng/p/3514817.html)。我們阻塞出SIGABRT之外的所有信號(hào),這樣就可知如果對(duì)kill的調(diào)用返回了,則改進(jìn)程一定已捕捉到該信號(hào),并且也從該信號(hào)處理程序返回。

本篇博文內(nèi)容摘自《UNIX環(huán)境高級(jí)編程》(第二版),僅作個(gè)人學(xué)習(xí)記錄所用。關(guān)于本書(shū)可參考:http://www.apuebook.com/。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 颍上县| 抚顺县| 峡江县| 南靖县| 施秉县| 河池市| 普定县| 礼泉县| 鲁甸县| 大新县| 镇宁| 衡东县| 贵州省| 建瓯市| 南澳县| 西安市| 静安区| 广汉市| 沙田区| 甘洛县| 湖北省| 城固县| 巴南区| 寿宁县| 舒城县| 禄劝| 靖远县| 固原市| 郯城县| 五寨县| 库伦旗| 临邑县| 汉川市| 临沧市| 米林县| 洪雅县| 浮梁县| 剑川县| 桐乡市| 都兰县| 华安县|