Объяснение sigsuspend нужны

мне нужно разъяснение по теме sigsuspend. У меня есть упрощенный пример

sigset_t mask, oldmask;
sigemptyset (&mask);
sigaddset (&mask, SIGRTMIN+1);
sigprocmask (SIG_BLOCK, &mask, &oldmask);

sigsuspend(&oldmask);

sigprocmask (SIG_UNBLOCK, &mask, NULL);

вот как я это понимаю:

  • не удалось очищает список сигналов (маска) - потому что он инициализируется в настоящее время блокированных сигналов (?)
  • sigaddset добавляет SIGRTMIN+1 в маску
  • sigprocmask устанавливает все сигналы в mask+oldmask для блокировки
  • sigsuspend (&oldmask) приостанавливает выполнение потока до поступления одного из заблокированных сигналов ? Не должно ли быть sigsuspend(&mask), если я хочу заблокировать SIGRTMIN+1?

    во-вторых, предположим, что у меня есть такой 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 понятия сигнала и различные функции, которые управляют обработкой сигналов. (И да, это, в частности, предписание "врача, Исцели себя".)

    пожалуйста, дайте мне знать,если здесь все еще есть ошибки.