Пока в примерах передавались только небольшие объемы данных. Важно заметить, что на практике размер буфера канала конечен. Другими словами, только определенное число байтов может находиться в канале, прежде чем следующий вызов 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;
(* Определить размер канала *)