Прототип системного вызова записи:
ssize_t write(int fd, const void *buf, size_t count);
Параметр count не имеет знака, а возвращаемое значение знаковое.
На странице помощи написано:
В случае успеха возвращается количество записанных байтов (ноль означает, что ничего не было записано). В случае ошибки возвращается -1, а errno
устанавливается соответствующим образом.
Однако в нем не говорится, каков предел параметра count. Он по-прежнему не говорит о поведении, когда количество больше SSIZE_MAX
.
Учитывая, что запись — это системный вызов, который можно использовать для универсальных устройств/файлов/чего угодно, если устройство поддерживает операции записи больше, чем SSIZE_MAX, возвращаемый тип не может обрабатывать реальное количество записанных байтов.
Для меня не имеет смысла передавать число байтов без знака и в результате возвращать число байтов со знаком. Почему бы просто не передать подписанный номер?
Похоже, что прототип функции записи подвержен ошибкам или, по крайней мере, оставляет возможную дыру в пути.
Кто-нибудь знает подробности об этом или где я могу найти эту информацию?
SSIZE_MAX
, и привязан к размерам буфера, настроенным для сокета с помощьюioctl
и/илиsetsockopt
. - person Ben Voigt   schedule 21.09.2012count
SSIZE_MAX
; или сделать егоssize_t
и проверить, является ли он неотрицательным, в зависимости от того, что вам больше по вкусу. В любом случае, такие большие блоки — плохая идея. - person Fred Foo   schedule 21.09.2012