Функция сна не работает при обработке SIGCHLD

Какая связь между обработкой SIGCHLD и функцией sleep?

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>

sig_atomic_t child_exit_status;

void clean_up_child_process(int signal_number)
{
    int status;
    wait(&status);
    child_exit_status = status;
}

int main()
{
    struct sigaction sigchld_action;
    memset(&sigchld_action, 0, sizeof(sigchld_action));
    sigchld_action.sa_handler = &clean_up_child_process;
    sigaction(SIGCHLD, &sigchld_action, NULL);

    pid_t child_pid = fork();
    if (child_pid > 0) {
        printf("Parent process, normal execution\n");
        sleep(60);
        printf("After sleep\n");
    } else {
        printf("Child\n");
    }

    return 0;
}

Потому что, когда я выполняю код сверху, он печатает:

Parent process, normal execution
Child
After sleep

Но эффекта от функции sleep при выполнении нет. Есть ли здесь какая-то особенность?


person thyago stall    schedule 10.12.2018    source источник
comment
Проверьте, возвращает ли sleep ошибку.   -  person user253751    schedule 10.12.2018


Ответы (1)


Из документации:

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

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

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

person thyago stall    schedule 10.12.2018