我已将产生问题的巨大光纤调度程序代码减少到以下几行。
我期望的是每次都干净地返回上下文,传递给处理程序。
我得到的是“处理程序”。打印了三遍,然后是分段错误。
#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(¤tly_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。