#c #c #linux #unix
#c #c #linux #unix
Вопрос:
Я думаю, что я не совсем понимаю, когда и как читать / записывать блоки для различных типов файлов. (дисковый файл, канал, сокет, FIFO)
Может ли кто-нибудь объяснить сценарии чтения и записи для каждого типа файлов?
Спасибо!!
Комментарии:
1. В чем разница между «pipe» и «FIFO»?
2. @kai, я думаю, вам повезет больше, если вы спросите, как сделать что-то конкретное или что делает конкретный фрагмент кода. Как написано, этот вопрос слишком расплывчатый…
3. Правильно ли я понимаю, что «блоки» являются ключевой частью вопроса (это как бы скрыто в предложении)? Итак, вы спрашиваете, каковы различия в возможных ситуациях блокировки при чтении или записи в файлы этих типов?
4. думаю, он спрашивает о буферизованном чтении и записи?
5. Этот вопрос слишком запутан, чтобы иметь возможность ответить в его текущей форме. Попробуйте привести конкретный пример в коде, который, по вашему мнению, будет вести себя по-разному с разными типами файлов, и опишите, в чем, по вашему мнению, может заключаться разница в поведении.
Ответ №1:
Для файла на диске read
и write
может ненадолго блокироваться во время выполнения запрошенного чтения / записи. A read
в конце файла всегда будет возвращать короткий результат, а a write
в файл на полной FS завершится ошибкой — за исключением различных необычных обстоятельств, read
/ write
в обычный файл никогда не будет заблокирован на неопределенный срок.
Для каналов, сокетов и FIFO read
блокируется, если данные недоступны, и write
блокируется, если канал / сокет / FIFO «заполнен» (например, вы записали кучу данных, а процесс на другом конце еще не прочитал его). Точный объем данных, необходимый для заполнения буфера, является переменным; например, для канала он обычно составляет от 4 до 64 КБ.
Комментарии:
1. Итак, для каналов, сокетов и FIFOs чтение и запись могут блокироваться на неопределенный срок?
2. Да, безусловно. Рассмотрим конвейеры оболочки: если у вас есть конвейер
foo | bar
, иfoo
он ничего не записывает в стандартный вывод,bar
он будет заблокированread(stdin)
до тех пор, пока что-нибудь не появится или канал не закроется.