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



         

Описание - часть 4


  msg3:array [0..MSGSIZE-1] of char = 'hello, world #3';

var

  inbuf:array [0..MSGSIZE-1] of char;

  fdr,fdw,j,pid:longint;

begin

  (* Открыть канал *)

  if not assignpipe (fdr,fdw) then

  begin

    perror ('Ошибка вызова pipe ');

    halt (1);

  end;

  pid := fork;

  case pid of

    -1:

    begin

      perror ('Ошибка вызова fork');

      halt (2);

    end;

    0:

    begin

      (* Дочерний процесс, закрывает дескриптор файла,

       * открытого для чтения и выполняет запись в канал

       *)

      fdclose (fdr);

      fdwrite (fdw, msg1, MSGSIZE);

      fdwrite (fdw, msg2, MSGSIZE);

      fdwrite (fdw, msg3, MSGSIZE);

    end;

    else

    begin

      (* Родительский процесс, закрывает дескриптор файла,

       * открытого для записи и выполняет чтение из канала

       *)

      fdclose (fdw);

      for j := 1 to 3 do

      begin

        fdread (fdr, inbuf, MSGSIZE);

        writeln (inbuf);

      end;

      wait(nil);

    end;

  end;

  halt (0);

end.

В конечном итоге получится однонаправленный поток данных от дочернего процесса к родительскому. Эта упрощенная ситуация показана на рис. 7.3.

Дочерний процесс

Родительский процесс

> > fdr

fdread()

^

fdwrite()

fdw > >

Рис. 7.3. Третий пример работы с каналами

Упражнение 7.1. В последнем примере канал использовался для установления связи между родительским и дочерним процессами. Но дескрипторы файлов канала могут передаваться и сквозь через несколько вызовов fork. Это означает, что несколько процессов могут писать в канал и несколько процессов могут читать из него. Для демонстрации этого поведения напишите программу, которая создает три процесса, два из которых выполняют запись в канал, а один – чтение из него. Процесс, выполняющей чтение, должен выводить все получаемые им сообщения на свой стандартный вывод.

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




Содержание  Назад  Вперед