Книга: Linux программирование в примерах
10.9. Сигналы, передающиеся через fork() и exec()
10.9. Сигналы, передающиеся через fork()
и exec()
Когда программа вызывает fork()
, ситуация с сигналами в порожденном процессе почти идентична ситуации в родительском процессе. Установленные обработчики остаются на месте, заблокированные сигналы остаются заблокированными и т.д. Однако, любые ожидающие в родителе сигналы в потомке сбрасываются, включая установленный с помощью alarm()
временной интервал. Это просто, и это имеет смысл.
Когда процесс вызывает одну из функций exec()
, положение в новой программе следующее:
• Сигналы с установленным действием по умолчанию остаются с этим действием по умолчанию.
• Все перехваченные сигналы сбрасываются в состояние с действием по умолчанию.
• Сигналы, которые игнорируются, продолжают игнорироваться. Особым случаем является SIGCHLD
. Если SIGCHLD
до вызова exec()
игнорировался, он может игнорироваться также и после вызова. В качестве альтернативы для него может быть восстановлено действие по умолчанию. То, что происходит на самом деле, стандартом POSIX намеренно не определяется. (Справочные страницы GNU/Linux не определяют, что делает Linux, и поскольку POSIX оставляет это не определенным, любой код, который вы пишете для использования SIGCHLD
, должен быть подготовлен для обработки любого случая.)
• Сигналы, заблокированные до вызова exec()
, остаются заблокированными и после вызова. Другими словами, новая программа наследует маску сигналов существующего процесса.
• Любые ожидающие сигналы (те, которые появились, но были заблокированы) сбрасываются. Новая программа не может их получить.
• Временной интервал, остающийся для alarm()
, сохраняется на своем месте. (Другими словами, если процесс устанавливает alarm
, а затем непосредственно вызывает exec()
, новый образ в конечном счете получит SIGALARM
. Если он сначала вызывает fork()
, родитель сохраняет установки alarm
, тогда как потомок, вызывающий exec()
, не сохраняет.
ЗАМЕЧАНИЕ. Многие, если не все. программы предполагают, что сигналы инициализированы действиями по умолчанию и что заблокированных сигналов нет. Таким образом, особенно если не вы писали программу, запускаемую с помощью exec()
, можно разблокировать перед вызовам exec()
все сигналы
- 10.1. Введение
- 10.2. Действия сигналов
- 10.3. Стандартные сигналы С: signal() и raise()
- 10.4. Обработчики сигналов в действии
- 10.5. API сигналов System V Release 3: sigset() и др.
- 10.6. Сигналы POSIX
- 10.7. Сигналы для межпроцессного взаимодействия
- 10.8. Важные сигналы специального назначения
- 10.9. Сигналы, передающиеся через fork() и exec()
- 10.10. Резюме
- Упражнения
- Глава 10 Сигналы
- Сигналы
- Разработка через тестирование и разработка с тестами
- Часть III. Шаблоны разработки через тестирование
- Звуковые сигналы BIOS
- 9.1.4.2. Функции-оболочки: execl() и др.
- Как переносить данные через USB-брелок («флэшку»)?
- Когда я не работаю за компьютером, через некоторое время он отключается. Можно ли это исправить?
- Я слышал, что через сеть на компьютер проникают вирусы. Как обезопасить себя?
- Как можно общаться через локальную сеть?
- Как искать работу через Интернет?
- 12.6. Сигналы реального времени