Настоящая причина восходит к несколько десятилетий назад. Оригинальный signal()
не перевооружил обработчик. Это также не перезапускало прерванные системные вызовы. Ребята из BSD решили иметь более «надежный» signal()
, поэтому они изменили эту семантику.
Поскольку поведение System V и BSD было таким разным, комитет POSIX решил ввести новый системный вызов sigaction()
с параметрами для изменения его поведения. Таким образом, вся причина существования sigaction()
заключается в том, чтобы иметь сигнал, использующий код, который ведет себя одинаково во всех вариантах Unix.
(Обратите внимание, что поведение signal()
может изменить даже при использовании того же libc, например, glibc использует поведение BSD по умолчанию и поведение SYSV, когда определено _XOPEN_SOURCE).