Использование третьего параметра (void* context) обработчика sigaction с SIG_INFO приводит к ошибке сегментации
Я сократил огромный код планировщика оптоволокна, который вызывал проблему, до строк ниже.
То, что я ожидаю, - это чистый возврат к контексту, каждый раз передаваемый обработчику.
То, что я получаю, это "Обработчик", распечатанный три раза, а затем ошибка сегментации.
#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;
}
Использовал gcc-4.4.3 и gcc-4.4.5 в двух разных дистрибутивах Linux.
1 ответ
На данный момент мое собственное исследование проблемы может быть представлено как частичный ответ.
Во-первых, я нашел эту статью, которая устарела и не цитирует никаких официальных источников информации: http://zwillow.blogspot.com/2007/04/linux-signal-handling-is-broken.html. Это релевантная цитата:
Вторая проблема: Вы не можете использовать setcontext(), чтобы выйти из обработчика сигнала и перейти в другой, ранее сохраненный контекст. (Или, в этом отношении, вы не можете использовать его, чтобы вернуться к тому же самому контексту, переданному в качестве аргумента обработчику сигнала.) Другими словами, обработчик сигнала похож на
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); }
не работает. Он не восстанавливает маску сигналов, указанную в puc_other, не восстанавливает альтернативный стек сигналов и т. Д. Однако эта схема работает безупречно на Solaris.
Если кто-то может подтвердить часть о Солярисе, это будет оценено.
Во-вторых, после разговора с преподавателем университета я понял, что настройка / замена контекста из обработчика сигнала не так проста, как в других ситуациях. К сожалению, человек, который объяснил мне это, не смог предоставить более подробную информацию в то время.
Таким образом, оба моих источника кажутся не совсем надежными, но, тем не менее, являются подсказками.