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


         

Вот результат работы программы на


  pipe_size := fpathconf (fdin, _PC_PIPE_BUF);

  writeln('Максимальный размер канала: ',pipe_size,' байт');

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

  sigaction (SIGALRM, @act, nil);

  while true do

  begin

    (* Установить таймер *)

    alarm (20);

    (* Запись в канал *)

    fdwrite (fdout, c, 1);

    (* Сбросить таймер *)

    alarm (0);

    inc(count);

    if count mod 1024 = 0 then

      writeln (count, ' символов в канале');

  end;

end.

Вот результат работы программы на некоторой системе:

Максимальный размер канала: 32768 байт

1024 символов в канале

2048 символов в канале

3072 символов в канале

4096 символов в канале

5120 символов в канале

.

.

.

31744 символов в канале

32768 символов в канале

Запись блокируется после вывода 32768 символов

Обратите внимание, насколько реальный предел больше, чем заданный стандартом POSIX минимальный размер канала.

Ситуация становится более сложной, если процесс пытается записать за один вызов fdwrite больше данных, чем может вместить даже полностью пустой канал. В этом случае ядро вначале попытается записать в канал максимально возможный объем данных, а затем приостанавливает выполнение процесса до тех пор, пока не освободится место под оставшиеся данные. Это важный момент: обычно вызов fdwrite для канала выполняется неделимыми порциями (atomically), и данные передаются ядром за одну непрерываемую операцию. Если делается попытка записать в канал больше данных, чем он может вместить, то вызов fdwrite выполняется поэтапно. Если при этом несколько процессов выполняют запись в канал, то данные могут оказаться беспорядочно перепутанными.

Взаимодействие вызова fdread с каналами является более простым. При выполнении вызова fdread система проверяет, является ли канал пустым. Если он пуст, то вызов fdread будет заблокирован до тех пор, пока другой процесс не запишет в канал какие-либо данные. При наличии в канале данных произойдет возврат из вызова fdread, даже если запрашивается больший объем данных, чем находится в канале.


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





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