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



         

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


      fdwrite (fdw, msg3, MSGSIZE);

    end;

    else

    begin

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

      for j := 1 to 3 do

      begin

        fdread (fdr, inbuf, MSGSIZE);

        writeln (inbuf);

      end;

      wait(nil);

    end;

  end;

  halt (0);

end.

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

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

fdwrite()

fdw > >

< < fdw

fdwrite()

v

fdread()

fdr < <

> > fdr

fdread()

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

Этот пример представлен графически на рис. 7.2. На нем показано, как канал соединяет два процесса. Здесь видно, что и в родительском, и в дочернем процессах открыто по два дескриптора файла, позволяя выполнять запись в канал и чтение из него. Поэтому любой из процессов может выполнять запись в файл с дескриптором fdw и чтение из файла с дескриптором fdr. Это создает определенную проблему. Каналы предназначены для использования в качестве однонаправленного средства связи. Если оба процесса будут одновременно выполнять чтение из канала и запись в него, то это приведет к путанице.

Чтобы избежать этого, каждый процесс должен выполнять либо чтение из канала, либо запись в него и закрывать дескриптор файла, как только он стал не нужен. Фактически программа должна выполнять это для того, чтобы избежать неприятностей, если посылающий данные процесс закроет дескриптор файла, открытого на запись, – раздел 7.1.4 объясняет возможные последствия. Приведенные до сих пор примеры работают только потому, что принимающий процесс в точности знает, какое количество данных он может ожидать. Следующий пример представляет собой законченное решение:

 (* Третий пример работы с каналами *)

uses linux,stdio;

const

  MSGSIZE=16;

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

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




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