2013-11-16 4 views
0

Я установил обработчик для каждого сигнала (SIGCHLD, SIGTSTP, SIGINT), теперь мне нужно заблокировать другие сигналы, пока работает какой-то обработчик.
Есть некоторые ресурсы, такие как sigaction(2) и Blocking for Handler, но я не понял, что мне делать в моей ситуации или как использовать код.
мало информации:
обработчиков: sigchldHandler, sigintHandler, sigtstpHander => signals.c
есть файл с именем smash.c, который содержит бесконечный цикл, чтобы получить команды все время.
Заранее спасибоБлокирующие сигналы для обработчика

ответ

4

При настройке sigaction вы можете указать маску сигналов, которые должны быть заблокированы при работе обработчика.

Вы можете использовать его так:

struct sigaction act; 
sigset_t set; 

memset(&act,0,sizeof act); 
sigemptyset(&set); 
sigaddset(&set, SIGUSR1); 
sigaddset(&set, SIGSTP); 

act.sa_mask = set; 
act.sa_handler = sigchldHandler; 
act.sa_flags = SA_RESTART; 

sigaction(SIGCHLD, &act, NULL); 

Это будет блокировать SIGUSR1 и SIGSTP в то время как ваш обработчик SIGCHLD работает. Сделайте то же самое для двух других обработчиков.

+0

Должен ли я помещать этот код перед бесконечным циклом или внутри каждого обработчика? – Rawhi

+0

@Rawhi Этот код используется для настройки обработчиков сигналов, чтобы можно было вызвать обработчики сигналов. Если вы разместите его внутри обработчиков сигналов, когда будет запущен этот код? Он никогда не будет запущен. Если вы разместите его после цикла infinte, он никогда не будет запущен. Если вы поместите его в бесконечный цикл, он будет работать на каждой итерации, что является просто пустой тратой. Поместите его перед бесконечным циклом. – nos

Смежные вопросы