Может ли SIGCONT разбудить спящий процесс?

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

void signal_handler(int signo)
{
        return;
}

int main()
{
        pid_t pid;

        pid = getpid();

        signal(SIGCONT, signal_handler);

        printf("%d\n", pid);

        sleep(100);

        printf("hello");

        return 0;
}

Когда вы выполняете этот код и передаете сигнал SIGCONT процессу, он выводит «Hello» из состояния сна и завершается.

С другой стороны, если вышеупомянутый обработчик сигнала удален и код выполнен, SIGCONT не проснется, даже если он будет доставлен процессу.

Какая разница?

Я заставил процесс возвращать свой pid, чтобы упростить доставку SIGCONT вручную.


person kwonryul    schedule 03.06.2020    source источник
comment
unix.stackexchange.com/questions/490792/   -  person William Pursell    schedule 03.06.2020
comment
Когда обработчик на месте, происходит сбой сна и установка errno в EINTR (то есть он прерывается). Когда обработчик не на месте, сигнал не прерывает сон. Если бы процесс был спящим из-за SIGSTOP, сигнал SIGCONT разбудил бы его (но не прервал бы вызов sleep). Здесь есть два разных употребления слова «сон».   -  person William Pursell    schedule 03.06.2020