Каков предел чтения функции read в unistd.h? - PullRequest
4 голосов
/ 08 сентября 2011

Стандартный Unix C имеет эту функцию:

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

Но каковы максимальные байты, которые функция чтения может прочитать 1 раз?

Ответы [ 3 ]

10 голосов
/ 08 сентября 2011

С man read(2):

read() пытается выполнить чтение до количества байтов из файлового дескриптора fd в буфер, начиная с buf. * ​​1008 *

Если count равен нулю, read() возвращает ноль и не имеет других результатов. Если число больше SSIZE_MAX, результат не уточняется.

Значение SSIZE_MAX зависит от вашей системы, но обычно это что-то вроде максимального значенияsigned long, что часто составляет 2 31 (32-разрядные системы) или 2 63 (64-разрядные системы).

2 31 байт составляет 2 гигабайта, так что вы, вероятно, в безопасности;на практике фактический драйвер устройства / буферы / сетевой ввод-вывод никогда не даст вам 2-гигабайтный кусок данных за один раз.

2 голосов
/ 08 сентября 2011

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

Итак, конкретное поведение read зависит от базового драйвера в ядре.

Вот почему важно всегда проверять возвращаемое значение read и проверять фактические прочитанные байты.

1 голос
/ 08 сентября 2011

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

Он может прочитать столько, сколько может вместить ваш буфер, ограничение SSIZE_MAX, а также ограничения вашего оборудования.

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