考虑下面的简单示例,它为SIGABRT的信号处理程序注册,然后调用abort()
。当我运行它时,程序在打印Done
之前终止,但在异步信号安全打印在捕获的信号之后终止。
这意味着SIGABRT不是一个可阻断的信号。这似乎得到了这个StackOverflow的答案的支持。然而,我在信号手册页中找不到任何关于这种行为的确证证据,它清楚地指出了The signals SIGKILL and SIGSTOP cannot be caught, blocked, or ignored
,但没有对SIGABRT作类似的提及。
有人能告诉我这种行为吗?
#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
编译生成以下输出
Ready
In Handler
Aborted
发布于 2022-08-17 20:45:18
SIGABRT
可以被阻止。但是在发送信号之前,abort()
函数会解除对信号的阻塞。
这是在POSIX中指定的
abort()
函数应覆盖、阻塞或忽略SIGABRT
信号。
如果您使用
kill(getpid(), SIGABRT);
而不是调用abort()
https://stackoverflow.com/questions/73394620
复制相似问题