Выбрать главу

echo "Child: child is running..."

sleep 5

echo "Child: child is done. Exiting."

В этом примере дочерний сценарий тривиально прост. Фактическая работа выполняется родителем. Родительский сценарий запускает дочерний сценарий и переводит его в фоновый режим выполнения. Идентификатор дочернего процесса сохраняется в переменной pid путем присваивания ей значения параметра $!, который всегда содержит идентификатор процесса последнего задания, переведенного в фоновый режим.

Родительский сценарий продолжает работу и в конце выполняет команду wait с идентификатором процесса дочернего сценария. Это вызывает приостановку родительского сценария до завершения дочернего сценария, после чего родительский сценарий возобновляет работу и тут же завершается.

В ходе выполнения родительский и дочерний сценарии производят следующий вывод:

[me@linuxbox ~]$ async-parent

Parent: starting...

Parent: launching child script...

Parent: child (PID= 6741) launched.

Parent: continuing...

Child: child is running...

Parent: pausing to wait for child to finish...

Child: child is done. Exiting.

Parent: child is finished. Continuing...

Parent: parent is done. Exiting.

Именованные каналы

В большинстве Unix-подобных систем существует возможность создавать файлы специального типа, которые называются именованными каналами (named pipe). Именованные каналы создают соединения между двумя процессами и могут использоваться как обычные файлы. Они не пользуются большой популярностью, но знать о такой возможности и уметь пользоваться ею желательно.

В программировании широко известна архитектура под названием клиент/сервер, основанная на использовании механизмов взаимодействий процессов, таких как именованные каналы или сетевые соединения.

Наиболее широко архитектура клиент/сервер используется в веб-приложениях, где веб-браузеры взаимодействуют с веб-серверами. Веб-браузер действует как клиент, посылая запросы серверу, в ответ на которые сервер посылает веб-страницы.

Именованные каналы имеют некоторое сходство с файлами, но на самом деле образуют буферы, действующие по принципу очереди: первым пришел, первым вышел (First-In, First-Out, FIFO). Так же как в случае с обычными (неименованными) каналами, данные записываются с одного конца канала и извлекаются из другого. С применением именованных каналов можно, например, выполнять следующие команды:

процесс1 > именованный_канал

и

процесс2 < именованный_канал

и такая пара команд будет действовать подобно конвейеру

процесс1 | процесс2

Создание именованного канала

Прежде чем использовать именованный канал, его нужно создать. Это делается с помощью команды mkfifo:

[me@linuxbox ~]$ mkfifo pipe1

[me@linuxbox ~]$ ls -l pipe1

prw-r--r-- 1 me   me    0 2012-07-17 06:41 pipe1

Здесь с помощью команды mkfifo создается именованный канал с именем pipe1. Командой ls мы исследовали созданный файл, и, как видите, первой в поле с атрибутами стоит буква p, сообщающая, что это именованный канал (pipe).

Использование именованных каналов

Чтобы показать, как работают именованные каналы, откроем два окна терминала (или, как вариант, выполним описанные ниже действия в двух виртуальных консолях). В первом терминале введите простую команду и перенаправьте ее вывод в именованный канал:

[me@linuxbox ~]$ ls -l > pipe1

После нажатия клавиши ENTER появится ощущение, что команда «зависла». Это объясняется тем, что с другого конца канала данные еще не были прочитаны. В таких ситуациях говорят, что канал заблокирован. Разблокировка произойдет автоматически, как только мы подключим процесс с другого конца канала и прочитаем данные из него. Во втором окне терминала введите следующую ­команду:

[me@linuxbox ~]$ cat < pipe1

Во втором терминале появится список содержимого каталога, созданный в первом окне, как результат работы команды cat. Команда ls в первом окне терминала благополучно разблокируется и завершится.

Заключительное замечание

Итак, мы закончили наше путешествие. Единственное, что осталось, — это практика, практика и еще раз практика. Даже при том, что на своем пути мы охватили широкий круг вопросов, в действительности мы лишь затронули верхушку айсберга под названием «командная строка». Существуют еще тысячи программ командной строки, которые вам предстоит открыть и изучить. Начните свои исследования с каталога /usr/bin, и вы увидите их!