X-Recipient: archive-cygwin AT delorie DOT com DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:message-id:date:from:mime-version:to:subject :content-type:content-transfer-encoding; q=dns; s=default; b=I/J XnTaTs8BdUNek/nLVFcwnIvBL90yykOZ91U68pa3SZiY01lnwldFD5vtpwgqmcee Q6ig2SxcKq2YCKUbTrsB1gIzfJaicTiFXIEOYWDWPOV8BE/YuL9HyqEeXmPW6oOj HoT+0u3AZCOkaGxp2OkXA7lMlllKYrVsE7pvBGuk= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:message-id:date:from:mime-version:to:subject :content-type:content-transfer-encoding; s=default; bh=yJXVwAqCd Lam2h8zoEeWYVhhYDk=; b=dHscrAt3X6c5k8WpjzYyLS1Ke7GDjk6duI7cFGxIO 2LA+r1yGRwdCnP+ofbRkccYJwPv1hEkOnWrKJ9NnrjAUWjmOFrTkzyeycKJPvYVd 8SD55eLR1y0mCDwgALt+nwwp1PFehkWN9cbBNs4TGQfC4zpv1kTT23gU9gqqPOJQ as= Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner AT cygwin DOT com Mail-Followup-To: cygwin AT cygwin DOT com Delivered-To: mailing list cygwin AT cygwin DOT com Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.8 required=5.0 tests=AWL,BAYES_00,SPF_HELO_PASS,SPF_PASS,T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 X-HELO: limerock03.mail.cornell.edu X-CornellRouted: This message has been Routed already. Message-ID: <54EFDEF4.4060308@cornell.edu> Date: Thu, 26 Feb 2015 22:05:24 -0500 From: Ken Brown User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Thunderbird/31.5.0 MIME-Version: 1.0 To: cygwin Subject: freopen/fread/popen bug Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit X-IsSubscribed: yes 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 #include #include 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 #include #include 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