SIGCONT имеет особую семантику.
Независимо от того, пойман ли SIGCONT, проигнорирован или имеет расположение по умолчанию , его генерация очистит все ожидающие сигналы остановки и возобновит выполнение остановленного процесса.,[ IEEE Std 1003.1-2017 ] Опять же, это возобновление происходит до любых других сигналов и даже до вызова обработчика SIGCONT (если есть).
(Эта специальная «лишенная» семантика имеет смысл. Чтобы процесс выполнял обработчик сигнала, сам процесс должен выполняться.)
POSIX здесь более понятен, чем APUE, говоря, что "[t]Действие по умолчанию для SIGCONT - возобновить выполнение в том месте, где процесс был остановлен, после первой обработки любых ожидающих разблокированных сигналов. "
Как уже упоминалось, фактический порядок доставки ожидающих сигналовзависит от реализации.Linux, по крайней мере, доставляет базовые сигналы UNIX в порядке возрастания чисел.
Чтобы продемонстрировать все это, рассмотрим следующий код.Он останавливает процесс, затем отправляет ему несколько сигналов, затем продолжает его, установив обработчики для всех перехватываемых сигналов, чтобы мы могли видеть, что обрабатывается, когда:
#define _POSIX_SOURCE
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
static int signals[] = { SIGSTOP, SIGURG, SIGUSR1, SIGHUP, SIGCONT, 0 };
static void
handler(int signo) {
// XXX not async-signal-safe
printf("<signal %d>\n", signo);
}
int
main(int argc, char **argv) {
int *sig = signals;
struct sigaction sa = { .sa_flags = 0, .sa_handler = handler };
sigfillset(&sa.sa_mask);
sig++; // can't catch SIGSTOP
while (*sig) {
sigaction(*sig, &sa, NULL); // XXX error check
sig++;
}
if (fork() == 0) { // XXX error check
sleep(2); // faux synchronization - let parent pause()
sig = signals;
while (*sig) {
printf("sending signal %d\n", *sig);
kill(getppid(), *sig);
sig++;
}
exit(0);
}
pause();
return 0;
}
Для меня это выводит
sending signal 19
sending signal 23
sending signal 10
sending signal 1
sending signal 18
<signal 1>
<signal 10>
<signal 18>
<signal 23>