Операция | Наличие открытых каналов | Блокировка включена (по умолчанию) | Флаг 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), то ядро гарантирует
ПРИМЕЧАНИЕ
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, то: