gpt4 book ai didi

c - 将 sigaction 处理程序的第三个参数(void* 上下文)与 SIG_INFO 一起使用会导致段错误

转载 作者:太空狗 更新时间:2023-10-29 17:13:38 25 4
gpt4 key购买 nike

我已将产生问题的大量光纤调度程序代码减少到以下几行。
我期望的是每次都干净地返回到上下文,传递给处理程序。
我得到的是“Handler.”打印了 3 次,然后是 Segmentation Fault。

#include <ucontext.h>
#include <signal.h>
#include <stdio.h>

ucontext_t currently_executed_context;

void handler_sigusr1(int signum, siginfo_t* siginfo, void* context)
{
currently_executed_context = (*(ucontext_t*)context);

printf("Handler. ");
setcontext(&currently_executed_context);
}

int main()
{
setbuf(stdout,0);

struct sigaction action_handler;

action_handler.sa_sigaction = handler_sigusr1;
action_handler.sa_flags = SA_SIGINFO;

sigaction(SIGUSR1,&action_handler,NULL);

for(;;) { kill(getpid(),SIGUSR1); sleep(1); }

return 0;
}

在两个不同的 Linux 发行版上同时使用 gcc-4.4.3 和 gcc-4.4.5。

最佳答案

此时,我自己对问题的研究可以作为部分答案提供。

首先,我找到了this article ,这是旧的,不引用任何官方信息来源:http://zwillow.blogspot.com/2007/04/linux-signal-handling-is-broken.html .这是一个相关的引用:

Second problem: You can't use setcontext() to leave signal handler and jump into another, previously saved, context. (Or, for that matter, you can't use it to return to the very same context passed as argument to the signal handler.) In other words, signal handler like

static void sighandler(
int signo, siginfo_t *psi, void *pv)
{
memcpy(puc_old, pv, sizeof(ucontext_t));
/* choose another context to dispatch */
setcontext(puc_another);
}

does not work. It does not restore signal mask specified in the puc_other, does not reestablish alternate signal stack, etc. However, this scheme works flawlessly on Solaris.

如果有人可以确认有关 Solaris 的部分,将不胜感激。

其次,在与一位大学讲师交谈后,我开始了解到从信号处理程序设置/交换上下文并不像在其他情况下那样直接。遗憾的是,向我解释此事的人当时无法提供更多详细信息。

因此,我的两个来源似乎都不完全可靠,但仍然是线索。

关于c - 将 sigaction 处理程序的第三个参数(void* 上下文)与 SIG_INFO 一起使用会导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15665329/

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