Использование третьего параметра (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(&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;
}

Использовал 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.

Если кто-то может подтвердить часть о Солярисе, это будет оценено.

Во-вторых, после разговора с преподавателем университета я понял, что настройка / замена контекста из обработчика сигнала не так проста, как в других ситуациях. К сожалению, человек, который объяснил мне это, не смог предоставить более подробную информацию в то время.

Таким образом, оба моих источника кажутся не совсем надежными, но, тем не менее, являются подсказками.

Другие вопросы по тегам