Шрифт:
В действительности человек, ожидающий опустения или заполнения сушилки, не должен просто неподвижно стоять. [101] Вместо этого незанятый супруг мог бы пойти и найти другую работу по кухне (такую, как подметание всех крошек за детьми на полу), пока сушилка снова не будет готова.
На языке Unix/POSIX эта концепция обозначается термином неблокирующий ввод/вывод, т.е. запрошенный ввод/вывод либо завершается, либо возвращает значение ошибки, указывающее на отсутствие данных (для читающего) или отсутствие места (для записывающего). Неблокирующий ввод/вывод применяется к каналам и FIFO, а не к обычным файлам на диске. Он может применяться также и к определенным устройствам, таким как терминалы, и к сетевым соединениям, обе эти темы выходят за рамки данной книги.
101
Ну, мы игнорируем мысль, что два супруга могли бы хотеть поговорить друг с другом и насладиться компанией — Примеч. автора.
С функцией
Открытие FIFO с установленным или сброшенным
Блокируется до открытия FIFO для записи.
Открывает файл, возвращаясь немедленно.
Блокирует до открытия FIFO для чтения.
Если FIFO был открыт для чтения, открывает FIFO и немедленно возвращается. В противном случае возвращает ошибку (возвращаемое значение -1 и
Как описано для обычных каналов, вызов
Функция
Функция
В заключение, поведение
Во всех случаях для каналов и FIFO
Также во всех случаях, как упоминалось, записи размером вплоть до
Как и в случае с
Наиболее все усложняется, когда установлен
размер >= nbytes | размер < abytes | |
---|---|---|
nbytes <= PIPE_BUF | write успешна | write возвращает (-1)/EAGAIN |
размер > 0 | размер = 0 | |
nbytes > PIPE_BUF | write записывает, что может | write возвращает (-1)/EAGAIN |
Для файлов, не являющихся каналами и FIFO и к которым может быть применен
размер > 0
размер = 0
Хотя есть ряд сбивающих с толку изменений поведения в зависимости от того, канал это или не канал, установлен
• Всегда можно отличить конец файла:
• Если нет доступных для чтения данных,
• Если для записи нет места,