Читать (fd, NULL, 0); Что это делает? это четко определено?

Я видел следующее утверждение в нескольких программах, большинство / все, кажется, сделано для Linux.

rv = read(fd, NULL, 0);

В некоторых программах это в цикле, в некоторых - одно утверждение.

Что это делает на самом деле?

Страница руководства говорит, что такой вызов может или не может проверить на ошибки...

Каково значение возвращаемого значения?

Какие типы файловых дескрипторов поддерживаются?

И если rv==0 как отличить "нет ошибки" от, например, "сокет закрыт".

1 ответ

Решение

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

Он вернется -1 если возникает ошибка и 0 иначе. Большинство ошибок, перечисленных в man 2 read может быть запрошен таким образом и будет возвращен в errno,

Например, возвращаемое значение -1 а также errno из EBADF будет перенастроен, если дескриптор файла закрыт. Вместо возвращаемого значения будет 0 если все хорошо и другое read не вернет ошибку, связанную с достоверностью дескриптора файла.

Последующий read с реальным буфером и nbyte > 0 все еще может генерировать любое количество ошибок, таких как ENOMEM, EAGAIN...

Другие вопросы по тегам