"Пока процесс остановлен, любые дополнительные сигналы, отправляемые процессу, не должны доставляться до тех пор, пока процесс не будет продолжен, за исключением SIGKILL
(...) Действие по умолчанию для SIGCONT
должен возобновить выполнение в точке, где процесс был остановлен, после первой обработки любых ожидающих разблокированных сигналов. "( Стандарт Unix, раздел Понятия сигналов .)
Обычно ничего особенного не происходит.Когда сигнал X перехватывается в обработчике сигнала для Y, выполнение просто передается в обработчик для X, после чего обработчик для Y возобновляет выполнение.
Следующая программа демонстрирует этоповедение.raise(sig)
отправляет сигнал вызывающему процессу (это похоже на kill(getpid(), sig)
).
void hello(int unused)
{
printf("Hello, ");
raise(SIGUSR2);
printf("!\n");
}
void world(int unused)
{
printf("world");
}
int main()
{
signal(SIGUSR1, hello);
signal(SIGUSR2, world);
raise(SIGUSR1);
return 0;
}
Это «безопасно», поскольку процесс будет принимать сигналы только от процессов с одинаковым идентификатором пользователя (или root
), таким образом, вы можете стрелять себе в ногу таким образом.