Read /dev/null differs from POSIX
Giorgos Keramidas
keramida at freebsd.org
Sat May 21 13:52:29 PDT 2005
On 2005-05-21 12:36, Steve Kargl <sgk at troutmask.apl.washington.edu> wrote:
> >From http://www.opengroup.org/onlinepubs/009695399/toc.htm
>
> /dev/null -- An infinite data source and data sink. Data
> written to /dev/null shall be discarded. Reads from
> /dev/null shall always return end-of-file (EOF).
>
> This program
>
> #include <stdio.h>
> int main(void) {
> int i=0,j;
> FILE *fp;
> fp = fopen("/dev/null", "r");
> while(fread(&j, sizeof(int), 1, fp) != 1) {
> i++;
> if (i == 5) break;
> }
The condition of the while loop above is bogus. fread() of any amount
of data from /dev/null returns 0 items, but the loop will still iterate,
increasing i as if some data was read.
Rewriting the loop as shown below reveals that /dev/null indeed works as
expected:
for (i = 0; fread(&j, sizeof(j), 1, fp) == 1; i++)
printf("step %d read %lu bytes\n", i,
(unsigned long)sizeof(j));
This *NEVER* prints a "step X read Y bytes" message from /dev/null.
> if (j == EOF)
> printf("EOF\n");
> else
> printf("j = %d\n", j);
This is bogus. fread() doesn't set the output buffer to EOF but marks
the `fp' stream as end-of-file'd. The correct way to check for
end-of-file on stdio.h streams is:
if (feof(fp))
... ;
More information about the freebsd-standards
mailing list