Когда и как чтение / запись блокирует (т. Е. Приостанавливает вашу программу) для разных типов файлов?

#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) до тех пор, пока что-нибудь не появится или канал не закроется.