Следующее взято со страницы руководства signal
Поведение signal() различается в разных версиях UNIX, а также исторически в разных версиях Linux. Избегайте его использования: используйте sigac- ция(2) вместо этого. См. Переносимость ниже.
Означает ли это, что мы всегда должны использовать вызов sigaction
вместо вызова signal
?
Да. Вы уже определили ссылку на Linux, и POSIX говорит то же самое:
Функция sigaction() заменяет функцию signal() и должна использоваться предпочтительно.
sigaction устраняет исторические несоответствия в сигнале, заставляя пользователя принимать решения о прерывании системного вызова (SA_RESTART), прерывании обработчика (sa_mask
, SA_NODEFER), дочерней обработке (SA_NOCLD[WAIT|STOP]), постоянстве расположения (SA_RESETHAND) и многом другом.
Если справочная страница говорит, что вы должны избегать этого, то вам следует избегать этого. Это не обязательно означает «всегда». Чаще всего, когда старая процедура заменяется новой процедурой, нет необходимости использовать старую процедуру, за исключением особых ситуаций, таких как работа со старыми системами, где новая процедура недоступна. Чтобы избежать
signal
, просто напишите свой код для использованияsigaction
, когда есть выбор. Если выбора нет, потому что что-то мешает использоватьsigaction
для получения желаемого результата, то используйтеsignal
.