Чтение онлайн

на главную - закладки

Жанры

Основы программирования в Linux
Шрифт:

He забудьте, что

execl
заменяет текущий процесс, если ошибок нет, оставшиеся строки не выполняются.

 perror("could not exec ./upper");

 exit(3);

}

Как это работает

Когда вы выполняете эту программу, ей можно передать файл для преобразования в прописные буквы. Работа делается программой upper, которая не обрабатывает аргументы с именами файлов. Обратите внимание на то, что вам не нужен исходный код программы upper; таким способом можно запустить любую исполняемую программу.

$ ./useupper file.txt

THIS IS THE FILE, FILE.TXT, IT IS ALL LOWER CASE.

Программа useupper применяет

freopen
для закрытия стандартного ввода и связывания потока файла с файлом, заданным как аргумент программы. Затем она вызывает
execl
, чтобы заменить код выполняемого процесса кодом программы upper. Поскольку файловые дескрипторы сохраняются, пройдя сквозь вызов
execl
, программа upper выполняется так же, как при вводе ее в строке командной оболочки

$ ./upper < file.txt

Потоки 

Процессы Linux могут взаимодействовать, отправлять друг другу сообщения и прерываться друг другом. Они могут даже организоваться и совместно использовать сегменты памяти, но они остаются обособленными объектами операционной системы. Процессы не настроены на совместное использование переменных.

Существует класс процесса, именуемый потоком (thread), который доступен во многих системах UNIX и Linux. Несмотря на то, что потоки трудно, программировать, они могут быть очень важны для некоторых приложений, таких как многопоточные серверы баз данных. Программирование потоков в Linux (и вообще в UNIX) не так распространено, как применение множественных процессов, поскольку процессы Linux очень легко применять и программирование множественных взаимодействующих процессов гораздо легче программирования потоков. Потоки обсуждаются в главе 12.

Сигналы

Сигнал — это событие, генерируемое системами UNIX и Linux в ответ на некоторую ситуацию, получив сообщение о котором процесс, в свою очередь, может предпринять какое-то действие. Мы применяем термин "возбуждать" (raise) для обозначения генерации сигнала и термин "захватывать" (catch) для обозначения получения или приема сигнала. Сигналы возбуждаются некоторыми ошибочными ситуациями, например нарушениями сегментации памяти, ошибками процессора при выполнении операций с плавающей точкой или некорректными командами. Они генерируются командной оболочкой и обработчиками терминалов для вызова прерываний и могут явно пересылаться от одного процесса к другому как способ передачи информации или коррекции поведения. Во всех этих случаях программный интерфейс один и тот же. Сигналы могут возбуждаться, улавливаться и соответственно обрабатываться или (по крайней мере, некоторые) игнорироваться.

Имена сигналов задаются с помощью включенного заголовочного файла signal.h. Они начинаются с префикса

SIG
и включают приведенные в табл. 11.3 сигналы.

Таблица 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
Фоновый процесс пытается писать

Сигнал

SIGCHLD
может быть полезен для управления дочерними процессами. По умолчанию он игнорируется. Остальные сигналы заставляют процессы, получившие их, остановиться, за исключением сигнала
SIGCONT
, который вызывает возобновление процесса. Они применяются программами командной оболочки для контроля работы и редко используются в пользовательских программах.

Чуть позже мы рассмотрим более подробно первую группу сигналов. Пока же достаточно знать, что если командная оболочка и драйвер терминала нормально настроены, ввод символа прерывания (обычно от нажатия комбинации клавиш <Ctrl>+<C>) с клавиатуры приведет к отправке сигнала

SIGINT
приоритетному процессу, т.е. программе, выполняющейся в данный момент. Это вызовет завершение программы, если в ней не предусмотрен перехват сигнала,

Если вы хотите отправить сигнал не текущей приоритетной задаче, а другому процессу, используйте команду

kill
. Она принимает для отправки процессу в качестве необязательного параметра имя сигнала или его номер и PID (который, как правило, можно определить с помощью команды ps). Например, для отправки сигнала "останов или разъединение" командной оболочке, выполняющейся на другом терминале с PID 512, вы должны применить следующую команду:

$ kill -HUP 512

Удобный вариант команды

kill
— команда
killall
, которая позволяет отправить сигнал всем процессам, выполняющим конкретную команду. Не все системы UNIX поддерживают ее, но ОС Linux, как правило, поддерживает. Этот вариант полезен, когда вы не знаете PID процесса или хотите отправить сигнал нескольким разным процессам, выполняющим одну и ту же команду. Обычное применение — заставить программу
inetd
перечитать параметры настройки. Для этого можно воспользоваться следующей командой:

Поделиться:
Популярные книги

Эфемер

Прокофьев Роман Юрьевич
7. Стеллар
Фантастика:
боевая фантастика
рпг
7.23
рейтинг книги
Эфемер

Кодекс Охотника. Книга XIX

Винокуров Юрий
19. Кодекс Охотника
Фантастика:
фэнтези
5.00
рейтинг книги
Кодекс Охотника. Книга XIX

Газлайтер. Том 16

Володин Григорий Григорьевич
16. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
6.40
рейтинг книги
Газлайтер. Том 16

Над бездной

Делински Барбара
Любовные романы:
современные любовные романы
7.29
рейтинг книги
Над бездной

Газлайтер. Том 39

Володин Григорий Григорьевич
39. История Телепата
Фантастика:
боевая фантастика
юмористическая фантастика
аниме
попаданцы
6.25
рейтинг книги
Газлайтер. Том 39

Trainspotting

Уэлш Ирвин
Дом и Семья:
образовательная литература
5.00
рейтинг книги
Trainspotting

Эволюционер из трущоб. Том 10

Панарин Антон
10. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Эволюционер из трущоб. Том 10

Кровь Севера

Мазин Александр Владимирович
3. Викинг
Фантастика:
альтернативная история
9.14
рейтинг книги
Кровь Севера

Я князь. Книга XVIII

Дрейк Сириус
18. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я князь. Книга XVIII

Рассказы

Фолкнер Уильям Катберт
Проза:
классическая проза
5.00
рейтинг книги
Рассказы

Инкарнатор

Прокофьев Роман Юрьевич
1. Стеллар
Фантастика:
боевая фантастика
рпг
7.30
рейтинг книги
Инкарнатор

Моров. Том 1 и Том 2

Кощеев Владимир
1. Моров
Фантастика:
попаданцы
альтернативная история
аниме
5.25
рейтинг книги
Моров. Том 1 и Том 2

Симеон Гордый

Балашов Дмитрий Михайлович
4. Государи московские
Научно-образовательная:
история
7.89
рейтинг книги
Симеон Гордый

Симфонии

Белый Андрей
Поэзия:
поэзия
6.25
рейтинг книги
Симфонии