Объяснение sigsuspend нужны
мне нужно разъяснение по теме sigsuspend. У меня есть упрощенный пример
sigset_t mask, oldmask;
sigemptyset (&mask);
sigaddset (&mask, SIGRTMIN+1);
sigprocmask (SIG_BLOCK, &mask, &oldmask);
sigsuspend(&oldmask);
sigprocmask (SIG_UNBLOCK, &mask, NULL);
вот как я это понимаю:
во-вторых, предположим, что у меня есть такой sigsuspend в цикле и появилось несколько сигналов SIGRTMIN+1. Будет ли такая петля продолжаться для каждого сигнала ? в какой-то очереди?
while(1){
sigsuspend(&oldmask)
printf("recieved signal");
}
Так что для каждого сигнала я получил сигнал' напечатано?
1 ответов
основные части предыдущего издания этого ответа были неправильными. Я прошу прощения за свою ошибку. Благодарю Wotim для указания на ошибку.
определение POSIX sigsuspend()
стандарт POSIX описывает sigsuspend()
довольно четко:
#include <signal.h>
int sigsuspend(const sigset_t *sigmask);
описание
на заменить текущую сигнальную маску вызывающего потока набором сигналов, на который указывает
sigmask
и затем приостановить поток до доставки сигнала, действие которого заключается либо в выполнении функции улавливания сигнала, либо в завершении процесса. Это не должно приводить к тому, что любые другие сигналы, которые могли ожидаться в процессе, будут ожидаться в потоке.если действие должно завершить процесс, то
sigsuspend()
никогда не возвратится. Если действие выполнить функция улавливания сигналов, затемsigsuspend()
возвращается после возвращения функции улавливания сигнала, при этом маска сигнала восстанавливается до набора, существовавшего доsigsuspend()
звонок.невозможно блокировать сигналы, которые нельзя игнорировать. Это обеспечивается системой без указания ошибки.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
с
sigsuspend()
приостанавливает выполнение потока на неопределенный срок, нет успешного завершения возвращаемого значения. Если происходит возврат, возвращается -1 и errno устанавливается для указания ошибки.ошибки
на
sigsuspend()
функция выходит из строя, если:
[EINTR]
Сигнал улавливается вызывающим процессом, и управление возвращается из функции улавливания сигнала.
кроме того, POSIX понятия сигнала говорит:
каждый поток имеет "маску сигнала", которая определяет набор сигналов в настоящее время заблокирована доставка к нему.
применение к фрагментам кода
на sigsuspend()
функция является современным аналогом старого pause()
это. Содержание oldmask
- это набор сигналов, который был заблокирован до добавления SIGRTMIN+1.
Да, это неправильно. Зову sigsuspend(&oldmask)
отправляет поток в спящий режим, пока один из сигналов не на oldmask
это полученный. Содержание oldmask
- это набор сигналов, который был заблокирован до добавления SIGRTMIN+1.
следующие два абзаца изъяты, а не обязательно осуждены как неправильные. Я думаю, что в обоих есть элементы истины, хотя в обоих тоже есть место для улучшения.
Вы не используете sigsuspend()
для блокировки сигналов как таковых; вы используете его для ожидания одного из заданных наборов сигналов прибывать.
если вы хотите игнорировать SIGRTMIN+1, то вам нужно использовать sigaction()
или вы можете использовать sigprocmask()
как и вы; это специально блокирует SIGRTMIN+1, а также все другие сигналы, которые уже были заблокированы.
правильно ли я понимаю, что он будет блокировать те же сигналы, что и раньше?
Предполагая, что "это"sigsuspend()
, тогда он будет блокировать любой сигнал не в oldmask
и ждать сигналов в oldmask
чтобы прибыть.
предполагая, что 'это' - это sigsuspend()
, тогда он будет блокировать любой сигнал в oldmask
и ждать одного из этих сигналов не на oldmask
чтобы прибыть.
и если я это сделаю
sigsuspend(&mask)
тогда он будет блокировать SIGRTMIN+1 и все сигналы вoldmask
из-заsigprocmask(SIG_BLOCK, &mask, &oldmask)
?
значительные изменения
Абсолютно нет! Это приостановит поток до тех пор, пока один из сигналы в mask
прибывает. Так как единственный сигнал в mask
является SIGRTMIN+1, только когда это прибывает будет sigsuspend()
вернуться. The sigprocmask()
сообщил, что было заблокировано перед вызовом в oldmask
; не изменять mask
(ваша переменная) вообще; он изменил маску сигнала процесса, добавив SIGRTMIN+1.
абсолютно нет! Это приостановит поток до тех пор, пока один из сигналов не на mask
прибывает. Так как единственный сигнал в mask
is SIGRTMIN+1, только этот сигнал блокируется, и когда поступает любой другой сигнал, он будет обработан и sigsuspend()
вернется. The sigprocmask()
сообщил, что было заблокировано перед вызовом в oldmask
; не изменять mask
(ваша переменная) вообще; он изменил маску сигнала процесса, добавив SIGRTMIN+1.
я настоятельно рекомендую прочитать или перечитать POSIX понятия сигнала и различные функции, которые управляют обработкой сигналов. (И да, это, в частности, предписание "врача, Исцели себя".)
пожалуйста, дайте мне знать,если здесь все еще есть ошибки.