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


         

В конечном итоге получится однонаправленный


  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. Для установления двусторонней связи между процессами можно создать два канала, работающих в разных направлениях. Придумайте возможный диалог между процессами и реализуйте его при помощи двух каналов.

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





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