Обработчик Sigaction в C - PullRequest
       7

Обработчик Sigaction в C

0 голосов
/ 07 ноября 2018

У нас есть задание, чтобы объяснить этот текст кода.Моя единственная проблема - это понимание функции handle_signal, почему мы использовали 2 новых sigaction, а затем использовали «old_treatment» с «rien»?

#define DELAY 1
#define NB_ITERATIONS 60
void handle_signal (int num_signal){
    struct sigaction rien, old_ treatment;
    printf ("Signal %d => ", num_signal);
    printf ("I have received a SIGTSTP.\n");
    rien.sa_handler = SIG_DFL;
    rien.sa_flags = 0;
    sigemptyset (&rien.sa_mask);
    sigaction (SIGTSTP, &rien, &old_ treatment);
    printf ("Then I sleep....\n");
    kill (getpid(), SIGSTOP);
    printf ("They wakes me?\n");
    Sigaction (SIGTSTP, &old_ treatment, NULL);
    printf ("Here we go again!\n");
}

int main (void){
    struct sigaction a;
    int i;
    a.sa_handler = handle_signal;
    sigemptyset (&a.sa_mask);
    sigaction (SIGTSTP, &a, NULL);
    for (i = 1; i < NB_ITERATIONS; i++) {
    sleep (DELAY);
    printf ("%d", i % 10);
    fflush (stdout);}
    printf ("End\n");
    return EXIT_SUCCESS;
}

1 Ответ

0 голосов
/ 07 ноября 2018

Цель этого - временно изменить действие для SIGTSTP, а затем восстановить его обратно.

sigaction(SIGTSTP, &rien, &old_handler);

устанавливает для него действие по умолчанию и сохраняет предыдущее действие в old_handler.

Затем он отправляет себе сигнал SIGSTOP, чтобы фактически приостановить процесс.

Когда это возвращается, это означает, что процесс был продолжен, поэтому он возвращает старое действие с помощью:

sigaction(SIGTSTOP, &old_handler, NULL);

Пока не ясно, зачем это нужно. Было бы более разумно, если бы он приостановил процесс, отправив сигнал SIGTSTP вместо SIGSTOP. В этом случае ему нужно установить действие по умолчанию, в противном случае оно будет повторяться бесконечно.

...