下面是在“Unix高级编程”中给出的使用abort
实现signals
功能的示例。在下面的代码中几乎没有疑问-
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 */ **STEP 1**
/*
* 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 */ **STEP 2**
exit(1); /* this should never be executed ... */
}
问题
当我们用kill
(用步骤1标记)发送第一个SIGABRT
时,为什么我们期望代码继续到下一行呢?(参见注释-‘如果我们在这里,进程捕获SIGABRT并返回’)
为什么我们需要再次传送kill
信号(在第二步中),然后exit(1)
就不会被击中。(请参阅代码中的注释)
发布于 2014-06-05 10:19:57
大多数程序在SIGABRT
上没有什么特别之处。
但是一些奇怪的程序可以在SIGABRT
上安装自己的信号处理程序,而且abort
函数仍然可以工作,甚至对它们来说也是如此。
因此,大多数-those不捕获SIGABRT
的程序不会超过步骤1(因为SIGABRT
的默认行为是转储核心,根据信号(7) .)。
少数几个捕获SIGABRT
的程序将一直运行到第二步(如果调用您的abort
)。此时,SIGABRT
的默认行为已经重新安装。因此,程序转储核心在步骤2。最后的exit(1)
无法到达。
https://stackoverflow.com/questions/24057420
复制相似问题