Системное программирование в UNIX средствами Free Pascal


Каналы и системный вызов ехес - часть 2


/p>

Рис. 7.5. Программа join

 

Программа join запустит обе программы на выполнение и свяжет стандартный вывод программы com1 со стандартным вводом программы com2. Работа программы join изображена на рис. 7.5 и может быть описана следующей схемой (без учета обработки ошибок):

 

процесс порождает дочерний процесс и ожидает действий от него

дочерний процесс продолжает работу

 

дочерний процесс создает канал

 

затем дочерний процесс порождает еще один дочерний процесс

 

В потомке дочернего процесса:

стандартный вывод подключается

к входу канала при помощи вызова dup2

 

ненужные дескрипторы файлов закрываются

 

при помощи вызова ехес запускается программа,

заданная параметром 'com1'

 

В первом дочернем процессе:

стандартный ввод подключается

к выходу канала при помощи вызова dup2

 

ненужные дескрипторы файлов закрываются

 

при помощи вызова ехес запускается программа,

заданная параметром 'com2'

Далее следует реализация программы join; она также использует процедуру fatal, представленную в разделе 7.1.5.

(* Программа join - соединяет две программы каналом *)

function join (com1, com2:ppchar):integer;

var

  fdin,fdout:longint;

  status:integer;

begin

  (* Создать дочерний процесс для выполнения команд *)

  case fork of

    -1:               (* ошибка *)

      fatal ('Ошибка 1 вызова fork в программе join');

    0:                (* дочерний процесс *)

      ;

    else              (* родительский процесс *)

    begin

      wait(@status);

      join:=status;

      exit;

    end;

  end;

  (* Остаток процедуры, выполняемой дочерним процессом *)

  (* Создать канал *)

  if not assignpipe(fdin,fdout) then

    fatal ('Ошибка вызова pipe в программе join');

  (* Создать еще один процесс *)

  case fork of

    -1:

      (* ошибка *)

      fatal ('Ошибка 2 вызова fork в программе join');

    0:

    begin

      (* процесс, выполняющий запись *)

      dup2 (fdout, 1);       (* направить ст. вывод в канал *)




- Начало -  - Назад -  - Вперед -



Книжный магазин