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


         

Размер канала


Пока в примерах передавались только небольшие объемы данных. Важно заметить, что на практике размер буфера канала конечен. Другими словами, только определенное число байтов может находиться в канале, прежде чем следующий вызов fdwrite будет заблокирован. Минимальный размер, определенный стандартом POSIX, равен 512 байтам. В большинстве существующих систем это значение намного больше. При программировании важно знать максимальный размер канала для системы, так как он влияет на оба вызова fdwrite и fdread. Если вызов fdwrite выполняется для канала, в котором есть свободное место, то данные посылаются в канал, и немедленно происходит возврат из вызова. Если же в момент вызова fdwrite происходит переполнение канала, то выполнение процесса обычно приостанавливается до тех пор, пока место не освободится в результате выполнения другим процессом чтения из канала.

Приведенная в качестве примера следующая программа записывает в канал символ за символом до тех пор, пока не произойдет блокировка вызова fdwrite. Программа использует вызов alarm для предотвращения слишком долгого ожидания в случае, если вызов fdread никогда не произойдет. Необходимо обратить внимание на использование процедуры fpathconf, служащей для определения максимального числа байтов, которые могут быть записаны в канал за один прием.

(* Запись в канал до возникновения блокировки записи *)

uses linux,stdio;

var

  count:integer;

(* Вызывается при получении сигнала SIGALRM *)

procedure alrm_action(signo:integer);cdecl;

begin

  writeln ('Запись блокируется после вывода ',count,' символов');

  halt (0);

end;

const

  c:char='x';

var

  fdin,fdout,pipe_size:longint;

  act:sigactionrec;

  temp:sigset_t;

begin

  (* Задать обработчик сигнала *)

  act.handler.sh := @alrm_action;

  sigfillset (@temp);

  act.sa_mask:=temp.__val[0];

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

  if not assignpipe (fdin,fdout) then

  begin

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

    halt (1);

  end;

  (* Определить размер канала *)



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





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