fwrite не блокируется?

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

6
задан John Michaels 22 March 2010 в 15:59
поделиться

3 ответа

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

4
ответ дан 8 December 2019 в 18:34
поделиться

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

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

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

7
ответ дан 8 December 2019 в 18:34
поделиться

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

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

2
ответ дан 8 December 2019 в 18:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: