Sigaction обработчик в С

голоса
0

У нас есть задание, чтобы объяснить этот текст кода. Моя единственная проблема понимания 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;
}
Задан 07/11/2018 в 20:02
источник пользователем
На других языках...                            


1 ответов

голоса
1

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

sigaction(SIGTSTP, &rien, &old_handler);

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

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

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

sigaction(SIGTSTOP, &old_handler, NULL);

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

Ответил 07/11/2018 в 20:30
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more