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

AltStyle によって変換されたページ (->オリジナル) /