Книга: Программирование для Linux. Профессиональный подход
4.5.1. Обработка сигналов
4.5.1. Обработка сигналов
Предположим, что многопотоковая программа принимает сигнал. В каком потоке будет вызван обработчик сигнала? Это зависит от версии UNIX. В Linux поведение программы объясняется тем. что потоки на самом деле реализуются в виде процессов.
Каждый поток в Linux является отдельным процессом, а сигнал доставляется конкретному процессу, поэтому никакой неоднозначности на самом деле нет. Обычно сигнал, поступающий от внешней программы, посылается процессу, управляющему главным потоком программы. Например, если программа с помощью функции fork()
делится на два процесса и дочерний процесс запускает многопотоковую программу, в родительском процессе будет храниться идентификатор главного потока дочернего процесса, и этот идентификатор будет включаться во все сигналы, посылаемые от предка потомку. Этим правилом следует руководствоваться при написании многопотоковых программ для Linux.
Тем не менее подобная особенность реализации библиотеки Pthreads в Linux не согласуется со стандартом POSIX. Нельзя полагаться на нее в программах, рассчитанных на то, чтобы быть переносимыми.
В многопотоковой программе один поток может послать сигнал другому. Для этого предназначена функция pthread_kill()
. Ее первым параметром является идентификатор потока, а второй параметр — это номер сигнала.
- 5.4 Команда trap: обработка прерываний
- 15.1.3. Обработка сигналов управления заданиями
- ГЛАВА 4 Обработка исключений
- Пример: обработчик управляющих сигналов консоли
- 19.7.9. Обработка сигналов и протоколирование
- Векторная обработка исключений
- 2.2. Базовая обработка командной строки
- 10.4. Обработчики сигналов в действии
- 12.5.2. Обработка масок сигналов: sigsetjmp() и siglongjmp()
- 7.2.1 Обработка сигналов
- Глава 12 Обработка сигналов
- 5.8. Обработка сигналов POSIX