Читаем UNIX Network Programming. Volume 2 Second Edition. Interprocess Communications полностью

ОперацияНаличие открытых каналовБлокировка включена (по умолчанию)Флаг O_NONBLOCK установлен
Открытие (open) FIFO только для чтенияFIFO открыт на записьВозвращается код успешного завершения операцииВозвращается код успешного завершения операции
Открытие (open) FIFO только для чтенияFIFO не открыт на записьПроцесс блокируется, пока FIFO не будет открыт на записьВозвращается код успешного завершения операции
Открытие (open) FIFO только для записиFIFO открыт на чтениеВозвращает код успешного завершения операцииВозвращает код успешного завершения операции
Открытие (open) FIFO только для записиFIFO не открыт на чтениеБлокируется до тех пор, пока FIFO не будет открыт на чтениеВозвращает ошибку с кодом ENXIO
Чтение (read) из пустого программного канала или FIFOПрограммный канал или FIFO открыт на записьБлокируется до тех пор, пока в программный канал или FIFO не будут помещены данные или они не будут закрыты всеми процессами, которыми они были открыты на записьВозвращает ошибку с кодом EAGAIN
Чтение (read) из пустого программного канала или FIFOПрограммный канал или FIFO не открыт на записьread возвращает 0 (конец файла)read возвращает 0 (конец файла)
Запись (write) в программный канал или FIFOПрограммный канал или FIFO открыт на чтение(См. в тексте)(См. в тексте)
Запись (write) в программный канал или FIFOПрограммный канал или FIFO не открыт на чтениеПрограммному потоку посылается сигнал SIGPIPEПрограммному потоку посылается сигнал SIGPIPE 

Запомните несколько дополнительных правил, действующих при чтении и записи данных в программные каналы и FIFO.

■ При попытке считать больше данных, чем в данный момент содержится в программном канале или FIFO, возвращается только имеющийся объем данных. Нужно предусмотреть обработку ситуации, в которой функция read возвращает меньше данных, чем было запрошено.

■ Если количество байтов, направленных на запись функции write, не превышает значения PIPE_BUF (ограничение, устанавливаемое стандартом Posix, о котором более подробно рассказывается в разделе 4.11), то ядро гарантирует атомарность операции записи. Это означает, что если два процесса запишут данные в программный канал или FIFO приблизительно одновременно, то в буфер будут помещены сначала все данные от первого процесса, а затем от второго, либо наоборот. Данные от двух процессов при этом не будут смешиваться. Однако если количество байтов превышает значение PIPEBUF, атомарность операции записи не гарантируется.

ПРИМЕЧАНИЕ

Posix.1 требует, чтобы значение PIPE_BUF равнялось по меньшей мере 512. Характерные значения, встречающиеся на практике, лежат в диапазоне от 1024 (BSD/OS 3.1) до 5120 байт (Solaris 2.6). В разделе 4.11 приведен текст программы, выводящей значение этой константы.

■ Установка флага O_NONBLOCK не влияет на атомарность операции записи в про-грaммный канал или FIFO — она определяется исключительно объемом посылаемых данных в сравнении с величиной PIPE_BUF. Однако если для прогрaммнoгo канала или FIFO отключена блокировка, возвращаемое функцией write значение зависит от количества байтов, отправленных на запись, и наличия свободного места в пpoгрaммнoм канале или FIFO. Если количество байтов не превышает величины PIPE_BUF, то:

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже