abort函數的功能是使異常程序終止。
#include <stdlib.h>void abort(void);此函數不返回
此函數將SIGABRT信號發送給調用進程(進程不應忽略此信號)。ISO C規定,調用abort將向主機環境遞送一個未成功的終止通知,其方法是調用raise(SIGABRT)函數。
實例
程序清單10-18 abort的POSIX.1實現
#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 ... */}
首先查看是否執行默認動作,若是則沖洗所以標準I/O流。這并不等價于對所有打開的流調用fclose(因為只沖洗,并不關閉它們),但是當進程終止時,系統會關閉所有打開的文件。如果進程捕捉此信號并返回,那么因為進程可能產生了更多的輸出,所以再一次沖洗所有的流。不進行沖洗處理的唯一條件是如果進程捕捉此信號,然后調用_exit或_Exit。在這種情況下,內存中任何未沖洗的標準I/O緩沖區都被丟棄。
如果調用kill使其為調用者產生信號,并且如果該信號是不被阻塞的(程序清單10-18保證做到這一點),則在kill返回前,該信號(或某個未決、未阻塞的信號)就被傳送給了該進程(http://www.CUOXin.com/nufangrensheng/p/3514817.html)。我們阻塞出SIGABRT之外的所有信號,這樣就可知如果對kill的調用返回了,則改進程一定已捕捉到該信號,并且也從該信號處理程序返回。
本篇博文內容摘自《UNIX環境高級編程》(第二版),僅作個人學習記錄所用。關于本書可參考:http://www.apuebook.com/。
新聞熱點
疑難解答