Шрифт:
Таблица 11.7
| Имя сигнала | Описание |
|---|---|
| SIGALRM | Генерируется таймером, установленным функцией alarm |
| SIGHUP | Посылается управляющему процессу отключающимся терминалом или управляющим процессом во время завершения каждому процессу с высоким приоритетом |
| SIGINT | Обычно возбуждается с терминала при нажатии комбинации клавиш <Ctrl>+<C> или сконфигурированного символа прерывания |
| SIGKILL | Обычно используется из командной оболочки для принудительного завершения процесса с ошибкой, т.к. этот сигнал не может быть перехвачен или проигнорирован |
| SIGPIPE | Генерируется при попытке записи в канал при отсутствии связанного с ним считывателя |
| SIGTERM | Отправляется процессу как требование завершиться. Применяется UNIX при выключении для запроса остановки системных сервисов. Это сигнал, по умолчанию посылаемый командой kill |
SIGUSR1 , SIGUSR2 | Может использоваться процессами для взаимодействия друг с другом, возможно, чтобы заставить их сообщить информацию о состоянии |
По умолчанию сигналы, перечисленные в табл. 11.8, также вызывают преждевременное завершение. Кроме того, могут выполняться действия, зависящие от реализации, например, создание файла core.
Таблица 11.8
| Имя сигнала | Описание |
|---|---|
| SIGFPE | Генерируется исключительной ситуацией во время операций с плавающей точкой |
| SIGILL | Процессор выполнил недопустимую команду. Обычно возбуждается испорченной программой или некорректным модулем совместно используемой памяти |
| SIGQUIT | Обычно возбуждается с терминала при нажатии комбинации клавиш <Ctrl>+<\> или сконфигурированного символа завершения (quit) |
| SIGSEGV | Нарушение сегментации, обычно возбуждается при чтении из некорректного участка памяти или записи в него, а также выход за границы массива или разыменование неверного указателя. Перезапись локального массива и повреждение стека могут вызвать сигнал SIGSEGV при возврате функции по неверному адресу |
При получении одного из сигналов, приведенных в табл. 11.9, по умолчанию процесс приостанавливается.
Таблица 11.9
| Имя сигнала | Описание |
|---|---|
| SIGSTOP | Останавливает выполнение (не может быть захвачен или проигнорирован) |
| SIGTSTP | Сигнал останова терминала часто возбуждается нажатием комбинации клавиш <Ctrl>+<Z> |
SIGTTIN , SIGTTOU | Применяются командной оболочкой для обозначения того, что фоновые задания остановлены, т.к. им необходимо прочесть данные с терминала или выполнить вывод |
Сигнал
Таблица 11.10
| Имя сигнала | Описание |
|---|---|
| SIGCONT | Продолжает выполнение, если процесс остановлен |
| SIGCHLD | Возбуждается, когда останавливается или завершается дочерний процесс |
Резюме
В этой главе вы убедились, что процессы — это основной компонент операционной системы Linux. Вы узнали, как они могут запускаться, завершаться и просматриваться и как вы можете применять их для решения задач программирования. Вы также познакомились с сигналами, которые могут использоваться для управления действиями выполняющихся программ. Вы убедились, что все процессы Linux, вплоть до
Глава 12
Потоки POSIX
В главе 11 вы видели, как обрабатываются процессы в ОС Linux (и конечно в UNIX). Эти средства обработки множественных процессов долгое время были характерной чертой UNIX-подобных операционных систем. Порой бывает полезно заставить одну программу делать два дела одновременно или, по крайней мере, создать впечатление такой работы. А может быть, вы хотите, чтобы несколько событий произошло одновременно и все они были тесно связаны, но при этом накладные расходы на создание нового процесса с помощью функции
В этой главе мы рассмотрим следующие темы:
создание новых потоков в процессе;
синхронизацию доступа к данным потоков одного процесса;
изменение атрибутов потока;
управление в одном и том же процессе одним потоком из другого.
Что такое поток?
Множественные нити исполнения в одной программе называют потоками. Более точно поток — это последовательность или цикл управления в процессе. Все программы, которые вы видели до настоящего момента, выполняли единственный процесс, хотя, как и многие другие операционные системы, ОС Linux вполне способна выполнять множественные процессы одновременно. В действительности у всех процессов есть как минимум один поток исполнения. У всех процессов, с которыми вы пока познакомились в этой книге, был только один поток исполнения.
Важно понять разницу между системным вызовом fork и созданием новых потоков. Когда процесс выполняет системный вызов fork, создается новая копия процесса с ее собственными переменными и собственным PID. Время выполнения этого нового процесса планируется независимо и выполняется он (в основном) независимо от создавшего его процесса. Когда мы создаем в процессе новый поток, этот поток исполнения в противоположность новому процессу получает собственный стек (и, следовательно, локальные переменные), но использует совместно с создавшим его процессом глобальные переменные, файловые дескрипторы, обработчики сигналов и положение текущего каталога.