Почему запись постоянно оставляет 4K байтов в буфере? - PullRequest
30 голосов
/ 10 апреля 2020

У меня, по сути, следующий код:

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 КБ байта. Я могу это исправить, обернув запись в al oop и переместив буфер вверх, но мне любопытно, почему он всегда терпит неудачу.

Например, если размер равен 2147483648, запись только для записи пишет 2147479552, оставляя 4096 неписаные. Почему это произошло, и правильно ли всегда заключать запись в al oop?

1 Ответ

50 голосов
/ 10 апреля 2020

Вы можете найти ответ в man 2 write:

Это не ошибка, если это число меньше числа запрошенных байтов; это может произойти, например, из-за того, что дисковое устройство заполнено.


И из справочного руководства write():

ssize_t write(int fd, const void *buf, size_t count);

Согласно POSIX.1, если count больше SSIZE_MAX, результат определяется реализацией; см. NOTES для определения верхнего предела Linux.

NOTES

Вкл. Linux, write() (и аналогичные системные вызовы) будет передавать не более 0x7ffff000 (2 147 479 552) байта, возвращая количество фактически переданных байтов. (Это верно как для 32-разрядных, так и для 64-разрядных систем.)

...