linux abort函数的实现

zxcasdqwe123asd 2012-03-04 08:35:00
各位大虾:
看这段代码时,不明白牙。具体请看下面代码:

#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 */
/*为什么这里要重新设置信号处理函数并再次发送SIGABRT信号呢?为什么不直接exit*/
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 ... */
}
...全文
599 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
jackywgw 2014-09-01
  • 打赏
  • 举报
回复
如果没有对应的SIGABRT的信号处理函数,代码在第一个kill(getpid(),SIGABRT),已经终止,并且是因为这个SIGABRT终止的。如果有对应的信号处理函数,此时会跳转到对应的信号处理函数,如果信号处理函数中没有终止进程或者说能返回,那么abort函数继续执行,也就是第一个kill(getpid(),SIGABRT)后面的代码,此时如果没有再次kill(getpid(),SIGABRT)而直接退出的话,说明不是由于abort退出的。
冬生0 2014-08-18
  • 打赏
  • 举报
回复
If the SIGABRT signal is ignored, or caught by a handler that returns, the abort() function will still terminate the process. It does this by restoring the default disposition for SIGABRT and then raising the signal for a second time. from "manual page" of abort.
jackson2009 2013-03-27
  • 打赏
  • 举报
回复
个人认为这里应该是调用进程捕捉到信号后的处理操作 进程捕捉到sigabort信号后将信号处理方式设置成默认,再向调用进程发送sigabort信号,用来终止调用进程
justkk 2012-03-05
  • 打赏
  • 举报
回复
abort() 通常伴随core文件产生
如果直接exit,不会产生core文件

23,124

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧