freopen/fread/popen bug

Ken Brown kbrown@cornell.edu
Fri Feb 27 06:17:00 GMT 2015


I'm not sure exactly where the bug is, but here's what happens (STC at the end):

1. I use freopen to open a file "foo" and associate it with stdin.

2. I use fread to read a byte from foo.

3. I call popen, expecting the child process to have foo as its stdin, with the 
file-position indicator pointing to the second byte.  But instead the child sees 
an empty stdin.

If I omit step 2, the child process does indeed have foo as its stdin.  Are my 
expectations wrong, or is this a bug?

Ken

STC:

$ cat foo
Contents of foo

$ cat good.c
#include <stdio.h>
#include <string.h>
#include <errno.h>

int
main ()
{
   FILE *f;
   int nread;
   char data[100];
   char *filename = "foo";

   f = freopen (filename, "r", stdin);
   if (!f)
     {
       fprintf (stderr, "Can't freopen %s: %s\n", filename, strerror (errno));
       return 1;
     }
   f = popen ("cat", "r");
   if (!f)
     {
       fprintf (stderr, "popen failed: %s\n", strerror (errno));
       return 1;
     }
   nread = fread (data, 1, 50, f);
   if (nread < 1)
     {
       fprintf (stderr, "Nothing read.\n");
       return 1;
     }
   data[nread] = '\0';
   printf ("%s", data);
   return 0;
}

$ gcc good.c -o good

$ ./good.exe
Contents of foo

[As expected.]

$ cat bad.c
#include <stdio.h>
#include <string.h>
#include <errno.h>

int
main ()
{
   FILE *f, *g;
   int nread;
   char data[100];
   char *filename = "foo";

   f = freopen (filename, "r", stdin);
   if (!f)
     {
       fprintf (stderr, "Can't freopen %s: %s\n", filename, strerror (errno));
       return 1;
     }
   nread = fread (data, 1, 1, f);
   if (nread != 1)
     {
       fprintf (stderr, "fread failed\n");
       return 1;
     }
   g = popen ("cat", "r");
   if (!g)
     {
       fprintf (stderr, "popen failed: %s\n", strerror (errno));
       return 1;
     }
   nread = fread (data, 1, 50, g);
   if (nread < 1)
     {
       fprintf (stderr, "Nothing read.\n");
       return 1;
     }
   data[nread] = '\0';
   printf ("%s", data);
   return 0;
}

$ gcc bad.c -o bad

$ ./bad.exe
Nothing read.

[Bug?]

--
Problem reports:       http://cygwin.com/problems.html
FAQ:                   http://cygwin.com/faq/
Documentation:         http://cygwin.com/docs.html
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple



More information about the Cygwin mailing list