gpt4 book ai didi

c - 在 C 中安装信号处理程序

转载 作者:太空宇宙 更新时间:2023-11-04 02:52:03 25 4
gpt4 key购买 nike

我正在尝试从我的程序中捕获 SIGSEGV。我遇到一个问题,我的 signal_handler 没有捕捉到信号。

void handler(int sig){
printf("catch SIGSEGV");
exit(EXIT_FAILURE);
}


void foo(){
struct sigaction sa;
sa.sa_flags = SA_SIGINFO;
sigemptyset(&sa.sa_mask);
sa.sa_handler = handler;
if(sigaction(SIGSEGV, &sa, NULL) == -1){
handle_error("sigaction");
}
/* if SIGSEGV happen here, I can catch it */
bar();
}

void bar() {
/* if SIGSEGV happen here, I cannot catch it */
}

这是否意味着我必须在 bar 中安装另一个信号处理程序?

但是如果我有一堆函数想要捕获相同的信号怎么办?我必须多次安装信号处理程序?

更新:

我试图直接在函数中安装处理程序,但仍然无法捕获它。所以我认为这可能是其他问题。但这很奇怪。我用gdb运行得到

Program received signal SIGSEGV, Segmentation fault.
0x080499b1 in is_printable_string (
str=0xb80fe768 <Address 0xb80fe768 out of bounds>)
at trace/trace.c:259
259 while(str[index]!='\0'){

这是我的is_printable_String

int is_printable_string(char *str){
struct sigaction sa;
sa.sa_flags = SA_SIGINFO;
sigemptyset(&sa.sa_mask);
sa.sa_sigaction = handler;
if(sigaction(SIGSEGV, &sa, NULL) == -1){
handle_error("sigaction");
}
int index;
index=0;
while(str[index]!='\0'){
if(!isprint(str[index])){
return -1;
}
index++;
}
/* continue... */

这似乎是我遇到了 SEG 错误,但我无法捕捉到它

我故意传递了那个指针,所以 str 参数没有问题。

最佳答案

来自 sigaction 的手册页...

SA_SIGINFO (since Linux 2.2) The signal handler takes three arguments, not one. In this case, sa_sigaction should be set instead of sa_handler. This flag is only meaningful when establishing a signal handler.

因此,你的问题应该是行

sa.sa_flags = SA_SIGINFO;

改成

sa.sa_flags = 0;

看看进展如何。

关于c - 在 C 中安装信号处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21180857/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com