Книга: Linux программирование в примерах
10.4.2. BSD и GNU/Linux
10.4.2. BSD и GNU/Linux
BSD 4.2 изменила способ работы signal()
.[107] На системах BSD обработчик сигнала после его возвращения остается на месте. Системы GNU/Linux следуют поведению BSD. Вот что происходит под GNU/Linux:
$ ch10-catchint /* Запустить программу */
handler: caught signal 2 /* Набираем ^C, вызывается обработчик */
handler: caught signal 2 /* И снова... */
handler: caught signal 2 /* И снова! */
handler: caught signal 2 /* Помогите! */
handler: caught signal 2 /* Как нам это остановить?! */
Quit (core dumped) /* ^, генерирует SIGQUIT. Bay */
На системе BSD или GNU/Linux обработчик сигнала не должен дополнительно использовать 'signal(signum, handler)
' для переустановки обработчика. Однако, лишний вызов не причиняет никакого вреда, поэтому сохраняется статус-кво.
В действительности, POSIX предоставляет функцию bsd_signal()
, которая идентична signal()
за тем исключением, что она гарантирует, что обработчик сигнала останется установленным:
#include <signal.h> /* XSI, устаревает */
void (*bsd_signal(int sig, void (*func)(int)))(int);
Это устраняет проблемы переносимости. Если вы знаете, что ваша программа будет работать лишь на системах POSIX, вы можете воспользоваться bsd_signal()
вместо signal()
.
Одно предостережение — эта функция также помечена как «устаревающая», что означает возможность отказа от нее в будущем стандарте. На практике, даже если от нее откажутся, поставщики скорее всего долгое время будут ее поддерживать. (Как мы увидим, функция API POSIX sigaction()
предоставляет достаточно возможностей для написания рабочей версии, если это вам нужно.)
- Debian GNU
- 10.4.2. BSD и GNU
- Appendix H. GNU Free Documentation License
- Appendix I. GNU General Public License
- 1.3. Автоматизация процесса с помощью GNU-утилиты make
- The GNU Image Manipulation Program
- 8.5. Обход дерева файлов: GNU du
- GNU Emacs and the Free Software Foundation
- Проект GNU и Фонд свободного ПО
- 2.1.2. Соглашения по работе с командной строкой в GNU
- Using the GNU C Compiler
- Appendix A. GNU Public License