Читать книгу 📗 "Linux программирование в примерах - Роббинс Арнольд"
• Временной интервал, остающийся для
alarm()alarmexec()SIGALARMfork()alarmexec()ЗАМЕЧАНИЕ. Многие, если не все. программы предполагают, что сигналы инициализированы действиями по умолчанию и что заблокированных сигналов нет. Таким образом, особенно если не вы писали программу, запускаемую с помощью
exec()exec()10.10. Резюме
«Наша история до настоящего времени, эпизод III»
• Интерфейсы обработки сигналов развились от простых, но подверженных состояниям гонок, до сложных, но надежных. К сожалению, множественность интерфейсов затрудняет их изучение по сравнению с другими API Linux/Unix.
• У каждого сигнала есть связанное с ним действие. Действие может быть одним из следующих: игнорирование сигнала; выполнение действия системы по умолчанию или вызов предоставленного пользователем обработчика. Действие системы по умолчанию, в свою очередь, является одним из следующих: игнорирование сигнала, завершение процесса; завершение процесса с созданием его образа; остановка процесса или возобновление процесса, если он остановлен.
•
signal()raise()signal()raise()signal()raise()• POSIX определяет функцию
bsd_signal()signal()• Действия, происходящие после возвращения из обработчика, варьируют в зависимости от системы. Традиционные системы (V7, Solaris, возможно, и другие) восстанавливают действие сигнала по умолчанию. На этих системах прерванный системный вызов возвращает -1, устанавливая в
errnoEINTRerrnoEINTR• GNU/Linux придерживается POSIX, который похож, но не идентичен с BSD. Если не было перемещения данных, системный вызов возвращает -1/
EINTRsigaction()• Обработчики сигналов, используемые с
signal()volatile sig_atomic_t• Первоначальной попыткой создания надежных сигналов был API сигналов System V Release 3 (скопированный из BSD 4.0). Не используйте его в новом коде.
• POSIX API содержит множество компонентов:
• маску сигналов процесса, перечисляющую текущие заблокированные сигналы;
• тип
sigset_tsigfillset()sigemptyset()sigaddset()sigdelset()sigismember()• функцию
sigprocmask()• функцию
sigpending()• API
sigaction()struct sigactionВсе эти возможности вместе используют блокирование сигналов и маску сигналов процесса для предоставления надежных сигналов. Более того, через различные флаги можно получить повторно запускаемые системные вызовы и более подходящие обработчики сигналов, которые получают большую информацию о причине, вызвавшей определенный сигнал (структура
siginfo_t• Механизмами POSIX для посылки сигналов являются
kill()killpg()raise()• Сигналы могут использоваться в качестве механизма IPC, хотя такой способ является плохим способом структурирования приложения, подверженным состояниям гонок. Если кто-то держит приставленным к вашей голове ружье, чтобы заставить вас работать таким способом, для правильной работы используйте тщательное блокирование сигналов и интерфейс
sigaction()•
SIGALARMalarm()pause()sleep()sleep()alarm()pause()sigsuspend()• Сигналы управления заданиями реализуют управление заданиями для оболочки. Большую часть времени следует оставлять их с установленными действиями по умолчанию, но полезно понимать, что иногда имеет смысл их перехватывать.
• Перехват
SIGCHLDsignal(SIGCHLD, SIG_IGN)sigaction()SA_NOCLDWAITsigaction()SA_NOCLDSTOPSIGCHLDSIGCHLDsigaction()SA_NOCLDSTOP