Является ли спецификация неопределенного поведения SIG_IGN относительно SIGFPE, SIGILL, SIGSEGV избыточной? - PullRequest
1 голос
/ 13 июня 2019

POSIX.1-2017 указывает в XSH 2.4.3 SIG_IGN , что

Поведение процесса не определено после того, как он игнорирует SIGFPE, SIGILL, SIGSEGV или SIGBUSсигнал , который не был сгенерирован kill (), sigqueue () или повышение () .

, и мне интересно, каково значение выделенной части?

Можете ли вы игнорировать эти сигналы, генерируемые только вышеперечисленными функциями, и при этом избегать вызывать неопределенное поведение?

Ответы [ 2 ]

0 голосов
/ 21 июля 2019

Вы не должны SIG_IGN - пропустить эти сигналы, если вы ожидаете, что ядро ​​их сгенерирует.

Вы можете поймать их с помощью sigaction и SA_SIGINFO в .sa_flags и использовать SA_SIGINFO, чтобы затем вы могли использовать info->si_code в обработчике, чтобы различать отправленные ядром и отправленные пользователем варианты. Если вы затем ничего не делаете в обработчике, если сигнал не был отправлен ядром, и завершаете работу / прекращаете работу, если это так, то с обработчиком SA_RESTART вы в основном получаете эмуляцию пользовательского пространства SIG_IGN, которая также работает с ядром. -ссылка SISGEV, SIGILL и т. д.

Если вы используете реальный SIG_IGN, вы должны позаботиться о том, чтобы яд не генерировал эти сигналы (нет недействительных ссылок на память, недопустимых инструкций и т. Д.).

Я думаю, что POSIX позволяет вам безопасно игнорировать SIGFPE, SIGILL, SIGSEGV или SIGBUS просто потому, что нет веских оснований категорически запрещать игнорировать эти сигналы при любых обстоятельствах, но я не думаю, что есть в противном случае большое значение имеет особенность.

0 голосов
/ 20 июля 2019

Другими словами, это говорит о том, что если сигнал генерируется ядром в результате аппаратного сбоя или прерывания , то игнорирование такого сигнала ведет к неопределенному поведению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...