Основы программирования в Linux
Шрифт:
He забудьте, что
Как это работает
Когда вы выполняете эту программу, ей можно передать файл для преобразования в прописные буквы. Работа делается программой upper, которая не обрабатывает аргументы с именами файлов. Обратите внимание на то, что вам не нужен исходный код программы upper; таким способом можно запустить любую исполняемую программу.
Программа useupper применяет
Потоки
Процессы Linux могут взаимодействовать, отправлять друг другу сообщения и прерываться друг другом. Они могут даже организоваться и совместно использовать сегменты памяти, но они остаются обособленными объектами операционной системы. Процессы не настроены на совместное использование переменных.
Существует класс процесса, именуемый потоком (thread), который доступен во многих системах UNIX и Linux. Несмотря на то, что потоки трудно, программировать, они могут быть очень важны для некоторых приложений, таких как многопоточные серверы баз данных. Программирование потоков в Linux (и вообще в UNIX) не так распространено, как применение множественных процессов, поскольку процессы Linux очень легко применять и программирование множественных взаимодействующих процессов гораздо легче программирования потоков. Потоки обсуждаются в главе 12.
Сигналы
Сигнал — это событие, генерируемое системами UNIX и Linux в ответ на некоторую ситуацию, получив сообщение о котором процесс, в свою очередь, может предпринять какое-то действие. Мы применяем термин "возбуждать" (raise) для обозначения генерации сигнала и термин "захватывать" (catch) для обозначения получения или приема сигнала. Сигналы возбуждаются некоторыми ошибочными ситуациями, например нарушениями сегментации памяти, ошибками процессора при выполнении операций с плавающей точкой или некорректными командами. Они генерируются командной оболочкой и обработчиками терминалов для вызова прерываний и могут явно пересылаться от одного процесса к другому как способ передачи информации или коррекции поведения. Во всех этих случаях программный интерфейс один и тот же. Сигналы могут возбуждаться, улавливаться и соответственно обрабатываться или (по крайней мере, некоторые) игнорироваться.
Имена сигналов задаются с помощью включенного заголовочного файла signal.h. Они начинаются с префикса
Таблица 11.3
Имя сигнала | Описание |
---|---|
SIGABORT | *Процесс аварийно завершается |
SIGALRM | Сигнал тревоги |
SIGFPE | *Исключение операции с плавающей точкой |
SIGHUP | Неожиданный останов или разъединение |
SIGILL | *Некорректная команда |
SIGINT | Прерывание терминала |
SIGKILL | Уничтожение (не может быть перехвачен или игнорирован) |
SIGPIPE | Запись
|
SIGQUIT | Завершение работы терминала |
SIGSEGV | *Некорректный доступ к сегменту памяти |
SIGTERM | Завершение, выход |
SIGUSR1 | Сигнал 1, определенный пользователем |
SIGUSR2 | Сигнал 2, определенный пользователем |
*Могут быть также предприняты действия, зависящие от конкретной реализации.
Если процесс получает один из этих сигналов без предварительной подготовки к его перехвату, процесс будет немедленно завершен. Обычно при этом создается файл с дампом ядра. Этот файл в текущем каталоге, названный core, представляет собой образ процесса, который может оказаться полезным при отладке.
К дополнительным относятся сигналы, приведенные в табл. 11.4.
Таблица 11.4
Имя сигнала | Описание |
---|---|
SIGCHLD | Дочерний процесс остановлен или завершился |
SIGCONT | Продолжить выполнение, если процесс был приостановлен |
SIGSTOP | Остановить выполнение (не может захватываться или игнорироваться) |
SIGTSTP | Сигнал останова, посылаемый с терминала |
SIGTTIN | Фоновый процесс пытается читать |
SIGTTOU | Фоновый процесс пытается писать |
Сигнал
Чуть позже мы рассмотрим более подробно первую группу сигналов. Пока же достаточно знать, что если командная оболочка и драйвер терминала нормально настроены, ввод символа прерывания (обычно от нажатия комбинации клавиш <Ctrl>+<C>) с клавиатуры приведет к отправке сигнала
Если вы хотите отправить сигнал не текущей приоритетной задаче, а другому процессу, используйте команду
Удобный вариант команды