Скачиваний:
56
Добавлен:
08.01.2014
Размер:
2.6 Mб
Скачать

Описание

uses linux;

Function SigPending:SigSet;

Procedure SigSuspend(Mask:SigSet);

SigPending позволяет узнать, какие из временно заблокированных сигналов необходимо обработать. Возвращаемое значение – маска отложенных сигналов.

SigSuspend временно заменяет маску сигналов для процесса на Mask, приостанавливая процесс до получения сигнала.

Глава 7. Межпроцессное взаимодействие при помощи программных каналов

Если два или несколько процессов совместно выполняют одну и ту же задачу, то они неизбежно должны использовать общие данные. Хотя сигналы и могут быть полезны для синхронизации процессов или для обработки исключительных ситуаций или ошибок, они совершенно не подходят для передачи данных от одного процесса к другому. Один из возможных путей разрешения этой проблемы заключается в совместном использовании файлов, так как ничто не мешает нескольким процессам одновременно выполнять операции чтения или записи для одного и того же файла. Тем не менее совместный доступ к файлам может оказаться неэффективным и потребует специальных мер предосторожности для избежания конфликтов.

Для решения этих проблем система UNIX обеспечивает конструкцию, которая называется программными каналами (pipe). (В следующих главах будут также изучены некоторые другие средства коммуникации процессов.) Программный канал (или просто канал) служит для установления односторонний связи, соединяющей один процесс с другим, и является еще одним видом обобщенного ввода/вывода системы UNIX. Как увидим далее, процесс может посылать данные в канал при помощи системного вызова fdwrite, а другой процесс может принимать данные из канала при помощи системного вызова fdread.

7.1. Каналы

7.1.1. Каналы на уровне команд

Большинство пользователей UNIX уже сталкивались с конвейерами команд:

$ pr doc | lр

Этот конвейер организует совместную работу команд pr и lр. Символ | в командной строке сообщает командному интерпретатору, что необходимо создать канал, соединяющий стандартный вывод команды pr со стандартным вводом команды lр. В результате этой команды на матричный принтер будет выведена разбитая на страницы версия файла doc.

Разобьем командную строку на составные части. Программа pr слева от символа, обозначающего канал, ничего не знает о том, что ее стандартный вывод посылается в канал. Она выполняет обычную запись в свой стандартный вывод, не предпринимая никаких особых мер. Аналогично программа lр справа выполи чтение точно так же, как если бы она получала свой стандартный ввод с клавиатуры или из обычного файла.1 Результат в целом будет таким же, как при выполнении следующей последовательности команд:

$ pr doc > tmpfile

$ lр < tmpfile

$ rm tmpfile

Управление потоком в канале осуществляется автоматически и прозрачно для процесса. Поэтому, если программа pr будет выводить информацию слишком быстро, то ее выполнение будет приостановлено. После того как программа lр догонит программу pr, и количество данных, находящихся в канале, упадет до приемлемого уровня, выполнение программы pr продолжится.

Каналы являются одной из самых сильных и характерных особенностей ОС UNIX, доступных даже с уровня командного интерпретатора. Они позволяют легко соединять между собой произвольные последовательности команд. Поэтому программы UNIX могут разрабатываться как простые инструменты, осуществляющие чтение из стандартного ввода, запись в стандартный вывод и выполняют одну, четко определенную задачу. При помощи каналов из этих основных блоков могут быть построены более сложные командные строки, например, команда

$ who | wc -l

направляет вывод программы who в программу подсчета числа слов wc, а задание параметра -l в программе wc определяет, что необходимо подсчитывать только число строк. Таким образом, в конечном итоге программа wc выводит число находящихся в системе пользователей (иногда нужно исключить из суммы первую строку-заголовок вывода who).

Соседние файлы в папке Полищук, Семериков. Системное программирование в UNIX средствами Free Pascal