Включить обработчик сигнала, используя sigaction в C - PullRequest
9 голосов
/ 25 февраля 2011
  struct sigaction psa;

Я включил мой обработчик сигналов в основной функции, как показано ниже:

    memset (&psa, 0, sizeof (psa));
    psa.sa_handler = pSigHandler;
    sigaction (SIGALRM, &psa, NULL);
    sigaction(SIGVTALRM, &psa, NULL);
    sigaction(SIGPROF, &psa, NULL);

Мой обработчик сигналов выглядит следующим образом:

static void pSigHandler(int signo){
    printf("Pareint signum: %d", signo);// debug
    switch (signo) {
        case SIGALRM:
            printf("P SIGALRM handler");//debug
            break;
        case SIGVTALRM:
            printf("P SIGVTALRM handler");//debug
            break;
        case SIGPROF:
            printf("P SIGPROF handler");//debug
            break;
        default: /*Should never get this case*/
            break;
    }
    return;
}

Теперь мой вопрос может бытьДля некоторых очевидно, почему я не вижу напечатанные строки отладки, когда я запускаю это?На самом деле ничего не было напечатано.Большое спасибо за помощь в понимании этого.Я запускаю его на Linux, использовал Eclipse для программирования.

1 Ответ

13 голосов
/ 25 февраля 2011
#include <stdio.h>
#include <signal.h>

static void pSigHandler(int signo){
    switch (signo) {
            case SIGTSTP:
            printf("TSTP");
            fflush(stdout);
            break;
    }
}

int main(void)
{
    struct sigaction psa;
    psa.sa_handler = pSigHandler;
    sigaction(SIGTSTP, &psa, NULL);
    for(;;) {}
    return 0;
}

Потому что вам нужно fflush (stdout)

попробовать с Cz

Я даже не уверен, безопасно ли использовать stdio в обработчике сигналов.

Обновление: http://bytes.com/topic/c/answers/440109-signal-handler-sigsegv

По этой ссылке вам не следует этого делать.

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