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


         

Это родительский процесс, выполнить чтение


      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';

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





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