2016-02-08 5 views
3

я получил предупреждение при компиляции моего кода, который вызывает write()Почему write() возвращает ssize_t, но принимает параметр size_t?

warning: comparison between signed and unsigned integer expressions [-Wsign-compare]

Вот определение записи():

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

RETURN VALUE 
    On success, the number of bytes written is returned (zero indicates 
    nothing was written). On error, -1 is returned, and errno is set 
    appropriately. 

Это просто выглядит странно для меня. Предположим, что ssize_t является int, и я закончил тем, что написал что-то большое (> 2 ГБ). Я не могу просто использовать сравнение возвращаемого значения write() vs count, могу ли я?

(Редактировать: может быть, я должен правильно написать свой вопрос: что было бы правильным способом использования write() без предупреждения или работы в ситуации, которая учитывает == -1 после преобразования знака? Да, я знаю, что это неопределенное поведение)

+2

Примечание: 'ssize_t' является POSIX, а не стандартным C.' size_t' is. –

+1

Если 'ssize_t' является' int', тогда вы используете 32-битную ОС, которая, скорее всего, не поддерживает файлы> 2 ГБ. В этом случае вам понадобится другой API - см. Например [этот вопрос] (http://stackoverflow.com/questions/4003405/32-bit-windows-and-the-2gb-file-size-limit-c -с-FSEEK-и-ftell). – Kenney

+0

@SouravGhosh: Так же, как 'write' тоже не является стандартным C. Какова ваша позиция? – Olaf

ответ

7

Возвращаемое значение - это тип signed, позволяющий вернуть значение -1, чтобы указать отказ.

С http://linux.die.net/man/2/write:

В случае успеха, число записанных байт возвращается (ноль указывает, ничего не было написано). При ошибке возвращается -1, а errno устанавливается соответствующим образом.

+1

Другими словами, он крадет 50% выходного диапазона, чтобы действовать как флаг успеха. Я уверен, что в то время это казалось хорошей идеей. –

+0

@ M.M. Я сомневаюсь, что кто-то когда-нибудь напишет даже половину 'size_t' за раз. Вероятно, вы даже не сможете выделить большую часть непрерывной памяти. –

+0

@ M.M, они могли использовать возвращаемое значение 1 для успеха и -1 для отказа. Задний. Интересно, возвращает ли он число, меньшее, чем 'count'? Что бы это значило - половина успеха? –