Fwrite неблокирует? - PullRequest
       10

Fwrite неблокирует?

6 голосов
/ 22 марта 2010

Перед вызовом fflush могу ли я считать fwrite неблокируемой записью? Если нет, то почему и каковы мои альтернативы?

Ответы [ 3 ]

7 голосов
/ 22 марта 2010

fwrite() может блокировать.Он использует (обычно) внутренний буфер с максимальной длиной.Он будет отправлять данные (весь или часть своего внутреннего буфера), когда буфер заполнится.

Функции setbuf() и setvbuf() позволяют изменить максимальную длину буфера и фактически предоставляют блок длябуфер, но детали зависят от реализации, поэтому вам придется прочитать документацию для вашей конкретной библиотеки C.

Концептуально, если вы хотите гарантированную неблокирующую запись при любых условиях, тогда вам нужны потенциально бесконечные буферыкоторый может быть несколько дорогим.Вы можете создавать свои собственные функции для буферизации данных (в пределах блока ОЗУ, используя realloc(), чтобы увеличить его при необходимости) и записывать (с fwrite() и возможно fflush()) только в конце.В качестве альтернативы вы можете попытаться использовать неблокирующий ввод-вывод, при котором функции записи никогда не блокируются, но могут ответить, что они отказываются принимать ваши данные из-за внутренней перегрузки.Неблокирующий ввод / вывод не является частью самого стандарта C (для этого нет функции f*()), но в некоторых системах его можно найти под разными именами (например, с fcntl() и write() в системах Unix).

4 голосов
/ 22 марта 2010

Технически fwrite() является блокирующим вызовом, который не возвращается до завершения процедуры. Однако определение завершения для fwrite() состоит в том, что предоставленные вами данные были записаны во внутренний файловый буфер. Как побочный эффект, часть этого буфера также может быть записана на диск как часть вызова fwrite(), но вы не можете полагаться на это поведение. Если вам абсолютно необходимо, чтобы данные были на диске, вам нужно позвонить fflush().

2 голосов
/ 22 марта 2010

fwrite () блокирует. fwrite () может вызывать fflush () внутренне в любое время.

Если все, что вам нужно для буферизации, тогда буферизуйте в своем собственном массиве. Буфер fwrite обычно составляет несколько килобайт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...