使用信号中止功能实现

时间:2014-06-05 10:14:29

标签: c++ c linux unix signals

下面是使用{#1}}的{​​{1}}功能实现示例,如#34; 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 ... */ } 时(标记为步骤1),为什么我们期望代码继续下一行? (请参阅评论 - ' 如果我们在这里,请抓住SIGABRT并返回')

湾为什么我们需要再次传递kill信号(在步骤2中),然后SIGABRT不应该被击中。 (参见代码中的评论)

1 个答案:

答案 0 :(得分:5)

大多数程序都不会对SIGABRT做任何特别的事情。

但是一些奇怪的程序可以在SIGABRT上安装自己的信号处理程序,而abort函数仍然可以工作,即使对于它们也是如此。

所以大多数程序都没有捕获SIGABRT - 不会超过第1步(因为SIGABRT的默认行为是根据signal(7)转储核心。 )。

抓住SIGABRT的少数程序将持续到第2步(如果调用abort)。此时,已重新安装SIGABRT的默认行为。所以程序在第2步转储核心。无法到达最终的exit(1)