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