[<<Previous Entry] [^^Up^^] [Next Entry>>] [Menu] [About The Guide]
 Особенности системных вызовов

Есть некоторые особенности при работе следующих системных вызовов с
программными каналами:
open(2) Этот  системный вызов  не нужен  при работе с каналом, так как
   pipe(2) сам открывает оба конца канала.

close(2) Этот системный вызов используется обычным образом и закрывает
   канал, так  же как  любой другой файл, когда работа с ним окончена.
   Кроме того, ниже описано, как он действует на read(2) и write(2).

read(2) Этот  системный вызов читает столько данных, сколько на момент
   вызова есть  в канале.  Если количество байтов в канале меньше, чем
   требуется, read(2)  возвращает значение  меньшее, чем его последний
   аргумент. read(2) возвращает 0, если обнаруживает, что другой конец
   канала закрыт,  т.е. все  потенциальные пишущие процессы закрыли их
   файловые дескрипторы,  связанные  с  входным  концом  канала.  Если
   пишущий процесс  опередил читающий,  может потребоваться  несколько
   операций чтения,  прежде чем  read(2) возвратит  0, показывая конец
   файла. Если  канал пуст  (но файловый  дескриптор другого конца еще
   открыт), read(2) будет заблокирован.

write(2) Этот  системный вызов  ведет себя  нормально до того момента,
   пока в  канале есть  место.  Канал  имеет  небольшую  фиксированную
   емкость, обычно  десять блоков.  В канал  нельзя сделать  частичную
   запись. Если  количество байт, которые должны быть записаны, больше
   свободного пространства в канале, пишущий процесс остановится, пока
   читающий процесс не освободит достаточно места для записи.
   Если читающий  процесс закроет  свой конец  канала, пишущий процесс
   получит сигнал SIGPIPE при попытке записи в этот канал.

lseek(2) Этот  системный  вызов  не  допустим,  так  как  нет  способа
   перечитать данные из канала; чтение разрушает их.

dup(2) Системный  вызов dup(2)  часто используется для перенаправления
   стандартного вывода  и стандартного  ввода на соответствующие концы
   программного канала.

fcntl(2) Обычно, чтение из пустого канала и запись в переполненный
канал блокируются, как обсуждалось выше. Однако, вы имеете возможность
выключить это свойство каналов установкой флагов O_NDELAY и
O_NONBLOCK. При установленном O_NDELAY, read(2) при попытке читать из
пустого канала немедленно возвратит 0. Если установлен O_NONBLOCK,
чтение из пустого канала заставит read(2) возвратить -1 и установить
errno в EAGAIN. Аналогично будет себя вести write(2) при записи в
переполненный канал.
Все сказанное  приложимо и  к именованным  каналам, обсуждаемым ниже в
этом разделе,  за исключением того, что именованные каналы создаются и
открываются другим способом.
                    ОСОБЕННОСТИ СИСТЕМНЫХ ВЫЗОВОВ
Особенности системных вызовов при работе с каналами:

  open(2) - не нужен

  close(2) -  когда доступ к каналу закончен

  read(2) - обычно блокируется, если канал пуст

  write(2) - обычно блокируется, если канал заполнен

  lseek(2) - не допустим

  dup(2) - используется для перенаправления ввода/вывода в канал

  fcntl(2) - может установить режим ввода/вывода без задержек