Сигналы в C при использовании switchcontext - PullRequest
0 голосов
/ 25 февраля 2019

Я пытался реализовать библиотеку потоков пользовательского уровня, используя функции makecontext(), swapcontext() и getcontext().Я читал, что хорошей практикой является использование сигналов для функции расписания (с циклическим таймером), но пока добавляется новый поток, блокируйте сигналы.

Моя проблема заключается в следующем: я могу реализовать функцию для блокировкисигналы, но это не работает, когда я использую переключение контекста.

void initSignals()
{
    printf("initSignals\n");
    act.sa_handler = schedule;
    sigemptyset(&act.sa_mask);
    act.sa_flags = 0;
    sigaction(SIGALRM, &act, &oact);
}


void blockSignals()
{
    printf("blockSignals\n");
    //sigset_t sig_mask;
    sigemptyset(&sig_mask);
    sigaddset(&sig_mask, SIGALRM);
    sigprocmask(SIG_BLOCK, &sig_mask, NULL);
}

void unblockSignals()
{
    printf("unblockSignals\n");
    //sigset_t sig_mask;
    sigemptyset(&sig_mask);
    sigaddset(&sig_mask, SIGALRM);
    sigprocmask(SIG_UNBLOCK, &sig_mask, NULL);
    runTimer();
}

О sigset_t sig mask теперь это глобально, но я попытался установить его как локальную переменную тоже.Кроме того, я попытался использовать другие сигналы SIGPROF, SIGVTALRM, потому что мой циклический таймер выглядит так:

void runTimer()
{
    printf("runTimer\n");
    it.it_interval.tv_sec = 1;
    it.it_interval.tv_usec = 0;
    it.it_value.tv_sec = 1;
    it.it_value.tv_usec = 0;
    setitimer(ITIMER_REAL, &it, NULL);
}

И itimer позволяет использовать эти 3 типа тревоги ...

Так что вопрос: как блокировать сигналы, когда код использует функции переключения контекста?Является ли это возможным?Может быть, существуют другие функции, которые могут это сделать?

Я думал, что сигналы используются для всех процессов, поэтому я удивился, что он не работает ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...