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