首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SIGABRT是一个可阻断的信号吗?

SIGABRT是一个可阻断的信号吗?
EN

Stack Overflow用户
提问于 2022-08-17 20:35:43
回答 2查看 81关注 0票数 0

考虑下面的简单示例,它为SIGABRT的信号处理程序注册,然后调用abort()。当我运行它时,程序在打印Done之前终止,但在异步信号安全打印在捕获的信号之后终止。

这意味着SIGABRT不是一个可阻断的信号。这似乎得到了这个StackOverflow的答案的支持。然而,我在信号手册页中找不到任何关于这种行为的确证证据,它清楚地指出了The signals SIGKILL and SIGSTOP cannot be caught, blocked, or ignored,但没有对SIGABRT作类似的提及。

有人能告诉我这种行为吗?

代码语言:javascript
运行
复制
#include <signal.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>

static struct sigaction old_sa;

static void my_handler(int signo)
{
  const char x[] = "In Handler\n";
  write(STDOUT_FILENO, x, strlen(x));
}

int main()
{
  struct sigaction sa;
  memset(&sa, 0, sizeof(sa));
  sa.sa_handler = my_handler;
  sigemptyset(&sa.sa_mask);
  sigaddset(&sa.sa_mask, SIGABRT);
  if (0 != sigaction(SIGABRT, &sa, &old_sa))
  {
    perror("sigaction");
    exit(EXIT_FAILURE);
  }
  printf("Ready\n");

  abort();

  printf("Done\n");
  exit(0);
}

使用gcc ./try.c && ./a.out编译生成以下输出

代码语言:javascript
运行
复制
Ready
In Handler
Aborted
EN

Stack Overflow用户

回答已采纳

发布于 2022-08-17 20:45:18

SIGABRT可以被阻止。但是在发送信号之前,abort()函数会解除对信号的阻塞。

这是在POSIX中指定的

abort()函数应覆盖、阻塞或忽略SIGABRT信号。

如果您使用

代码语言:javascript
运行
复制
kill(getpid(), SIGABRT);

而不是调用abort()

票数 2
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73394620

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档