Я немного читал о sigaction()
(источники взяты из моих заметок по курсу), и я не уверен, что понимаю этот текст:
Маска сигнала рассчитывается и устанавливается только на время работы обработчика сигнала.
По умолчанию сигнал «sig» также блокируется при появлении сигнала.
После того, как действие установлено для определенного сигнала с использованием sigaction, оно остается установленным до тех пор, пока не будет явно запрошено другое действие.
Означает ли это, что маска сигнала по умолчанию восстанавливается после возврата из обработчика сигнала? Кроме того, нужно ли мне переустанавливать обработчик после его использования, как если бы я использовал signal()
?
Также есть этот фрагмент кода:
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void termination_handler(int signum) {
exit(7);
}
int main (void) {
struct sigaction new_action,old_action;
new_action.sa_handler = termination_handler;
sigemptyset(&new_action.sa_mask);
sigaddset(&new_action.sa_mask, SIGTERM);
new_action.sa_flags = 0;
sigaction(SIGINT, NULL, &old_action);
if (old_action.sa_handler != SIG_IGN) {
sigaction(SIGINT,&new_action,NULL);
}
sleep(10);
return 0;
}
Итак - как именно будет обрабатываться SIGTERM
? Я вижу, что установлен обработчик termination handler()
, но затем SIGTERM
был добавлен в маску сигнала без использования sigprocmask()
. Что это значит? Спасибо!
P.s. последний вопрос: почему выражение if
в main()
?