gpt4 book ai didi

无法处理连续的 SIGSEGV 信号

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

我正在尝试处理来 self 的代码的 SIGSEGV 信号。我在 Fedora 15 下用 C 语言编写了以下代码。我的问题是信号处理程序没有为第二个段错误调用。任何人都可以指出我做错了什么。

typedef struct _ST_DEMO
{
int m_iUnused;

_ST_DEMO()
{
m_iUnused = 0;
}
} ST_DEMO;

jmp_buf ex_buf__;

static void sig_hdl (int sig, siginfo_t *siginfo, void *context)
{
cout<<"Inside Signal Handler."<<endl;
longjmp(ex_buf__, 1);
}

int main (int argc, char *argv[])
{
ST_DEMO* pStDemo = 0;
struct sigaction act;

memset (&act, '\0', sizeof(act));

/* Use the sa_sigaction field because the handles has two additional parameters */
act.sa_sigaction = &sig_hdl;

/* The SA_SIGINFO flag tells sigaction() to use the sa_sigaction field, not sa_handler. */
act.sa_flags = SA_SIGINFO;

if (sigaction(SIGSEGV, &act, NULL) < 0)
{
perror ("sigaction");
return 1;
}

if(!setjmp(ex_buf__))
{
cout<<"Before First Seg Fault."<<endl;
cout<<pStDemo->m_iUnused<<endl;
}
else
{
cout<<"After jump."<<endl;
}

cout<<"Before Second Seg Fault."<<endl;
cout<<pStDemo->m_iUnused<<endl;

while(1)
{
sleep(1);
}

return 0;
}

最佳答案

您的 longjmp 将导致您跳转到该位置,但您不会从信号处理程序返回。这意味着信号仍然被阻塞(这是信号的默认行为,它们被屏蔽直到您从信号处理程序返回)。

您可以通过在 longjmp 之前清除处理程序中的信号掩码来指示您希望信号再次发生,从而解决此问题。

  • act.sa_flags 中使用 SA_NODEFER 标志以防止它首先被屏蔽。
  • 使用siglongjmp/sigsetjmp 函数,为您保存掩码

或者

  • 在 longjmp 之前或之后调用 sigprocmask 以自行取消屏蔽。

警告:这是一件非常危险的事情(捕获 SIGSEGV,然后从信号处理程序中进行 longjmp)并且几乎不可能用它做任何有用的事情。

如果内存访问错误发生在任何非异步信号安全和可重入的函数中,您将无法以任何理智的方式继续。

但是由于网站上有多个类似的问题,我想这是某种练习。

相关问题: Catching Segmentation Violations and Getting on with Life

也有用

Longjmp out of signal handler? longjmp() from signal handler

关于无法处理连续的 SIGSEGV 信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22612307/

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