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

Следующие системные вызовы имеют особенности при работе с программными
каналами:

open(2) Именованный канал открывается так же, как и обычный файл, но с
   дополнительными особенностями.  Как  правило,  если  вы  открываете
   именованный  канал   для  чтения,  системный  вызов  open(2)  будет
   ожидать, пока  какой-то другой процесс не откроет этот же канал для
   записи, и наоборот.
   Однако,  если   вы  открыватете  именованный  канал  для  чтения  с
   установленными флагами  O_NDELAY и  O_NONBLOCK, open(2)  немедленно
   вернет вам  правильный дескриптор  файла, даже если ни один процесс
   еще не  открыл его  для записи. Если вы открываете канал на запись,
   но никто еще не открыл его для чтения, open(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) Этот системный вызов практически не используется с именованными
   каналами

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) - может установить режим ввода/вывода без задержек