У меня есть по существу следующий код:
int fileWrite(int file, void * pBuffer, size_t size)
{
size_t bytesWritten = (size_t)write( file, pBuffer, size ) ;
if (bytesWritten != size)
{
return -1;
}
return 0;
}
Это работает, если размер составляет 1 ГБ, но когда размер составляет ~ 2 ГБ, он последовательно получает 4 КБ байта. Я могу исправить это, поместив запись в цикл и переместив буфер вверх, но мне любопытно, почему он всегда терпит неудачу.
Например, если размер 2147483648, запись только записывает 2147479552, оставляя 4096 незаписанным. Почему это происходит, и правильно ли всегда заключать запись в цикл?
c
linux
system-calls
TreeWater
источник
источник
write
будет потребляться одновременно, зависят от типа приемника данныхfile
(например, «обычный» файл, канал, сокет потока, сокет дейтаграммы, ...). Можете быть более конкретными?write
весь файл сразу? Обычный подход заключается в потоковой передаче данных размером буфера за раз, пока вы не напишите все.write()
не нужно записывать все это (что касается небольших буферов)SSIZE_MAX
ограничения. Спецификацияwrite()
говорит, что не обязана писать полный буфер, даже если это почти всегда так. Код без петель в вопросе является ошибкой.Ответы:
Вы можете найти ответ в
man 2 write
:И из
write()
описания страницы руководства :источник