Читать (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
...