Не имеет прямого отношения к «почему», но чтобы дать ответ на предполагаемое желание сделать это, я хотел бы упомянуть, что стандартная библиотека c ++ 11 имеет тип ссылочной оболочки, чтобы включить это. Он неявно конвертируется в ссылку и хранится в стандартных контейнерах.
Идея состоит в том, что Вы обеспечиваете маску в [1 110], эффективно список сигналов. how
аргумент говорит, что необходимо сделать с маской в [1 112].
можно или использовать SIG_BLOCK
для блокирования сигналов в эти set
список, или SIG_UNBLOCK
для разблокирования их. Ни одно из этих изменений сигналы, которые не установлены в списке. SIG_SETMASK
блоки сигналы в списке, и разблокируют тех, которые не установлены в списке.
, Например, предположите, что старый список блокирования был {SIGSEGV, SIGSUSP}
, и Вы звоните sigprocmask
с этими аргументами:
sigset_t x;
sigemptyset (&x);
sigaddset(&x, SIGUSR1);
sigprocmask(SIG_BLOCK, &x, NULL)
новый список блокирования теперь будет {SIGSEGV, SIGSUSP, SIGUSR1}
.
, Если Вы звоните sigprocmask
с этими аргументами теперь:
sigprocmask(SIG_UNBLOCK, &x, NULL)
новый список блокирования вернется к тому, чтобы быть {SIGSEGV, SIGSUSP}
.
, Если Вы звоните sigprocmask
с этими аргументами теперь:
sigprocmask(SIG_SETMASK, &x, NULL)
новый список блокирования будет теперь установлен на [1 123].
oldset
аргумент говорит Вам, каков предыдущий список блокирования был. Если у нас есть это объявление:
sigset_t y;
и мы называем код в предыдущих примерах как это:
sigprocmask(SIG_BLOCK, &x, &y)
теперь мы имеем:
y == {SIGSEGV, SIGSUSP}
, Если мы теперь делаем:
sigprocmask(SIG_UNBLOCK, &x, &y)
мы доберемся
y == {SIGSEGV, SIGSUSP, SIGUSR1}
и если мы делаем:
sigprocmask(SIG_SET, &x, &y)
мы получим это:
y == {SIGSEGV, SIGSUSP}
, потому что это - предыдущее значение набора блокирования.