This is the mail archive of the cygwin mailing list for the Cygwin project.
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
| Other format: | [Raw text] | |
I did this examples under the bash.
Attached is a cygcheck output of a cygwin 1.5.24 installation. With this version it works.
Tobias
> -----Ursprüngliche Nachricht-----
> Von: Eric Blake [mailto:ebb9@byu.net]
> Gesendet: Freitag, 15. Februar 2008 15:01
> An: cygwin@cygwin.com; Leutwein Tobias (BEG-PG/EES)
> Betreff: Re: 1.5.25-7 piping directed output to /dev/stdout
> will not work
>
> According to Leutwein Tobias (BEG-PG/EES) on 2/14/2008 11:51 PM:
> | Since I updated to 1.5.25 piping directed output to /dev/stdout with
> | bash 3.2.33-18 will not work.
>
> Updated from what prior version?
>
> |
> |> echo "test string" > /dev/stdout | wc -w
> | v:\Programme\cygwin\current\bin\bash: echo: write error: Bad file
> | descriptor
> | 0
>
> Hmm. The error message does not list a POSIX-style path to
> bash. Is this
> started directly under cmd.exe? At any rate, you've told
> bash to do the
> following:
>
> create a pipe, connecting echo's stdout to wc's stdin
> within echo, open /dev/stdout at the next available fd (3),
> as a clone of fd 1
> call dup2(3,1), which closes 1 then moves 3 in its place
>
> And it looks like what cygwin is doing is closing the handle
> owned by fd
> 1, so that the handle owned by fd 3 is invalid before it is
> reassociated
> with fd 1, explaining the bad fd write error.
>
> True - on some Unix systems, /dev/stdout is a device rather than a
> symlink, and as such, the OS goes to great pains to keep the
> original fd 1
> when going through the name /dev/stdout. And I'm not sure that this
> problem is cygwin specific. At any rate, it does not violate
> POSIX - you
> are in the realm of unportable behavior when you rely on /proc (or on
> /dev/stdout).
>
> On the other hand, this behavior is indeed different than what Linux
> provides. I tested the same scenario on Linux, and it
> appears to special
> case dup2 when moving the cloned fd back on top of the original, the
> underlying handle is not invalidated. Which means that the
> bug might lie
> in cygwin1.dll and not in bash.
>
> On the other hand, the following C program behaves correctly when
> simulating the same sequence of actions (although it avoids
> the unportable
> use of /proc). I'll have to investigate further to prove
> where the blame
> lies, but right now, it seems that it is in cygwin, for not treating
> open("/proc/self/fd/1") as equivalent to dup(1).
>
> #include <stdio.h>
> #include <stdlib.h>
> #include <sys/stat.h>
> #include <errno.h>
> #include <string.h>
> #include <unistd.h>
> #include <fcntl.h>
>
> int
> main (int argc, char* argv[])
>
> ~ int f = dup (1);
> ~ if (f < 0)
> ~ fprintf (stderr, "failed to dup stdout, %d\n", errno);
> ~ f = dup2 (f, 1);
> ~ if (f < 0)
> ~ fprintf (stderr, "failed to dup2 back to stdout, %d\n", errno);
> ~ f = write (1, "hi\n", 3);
> ~ if (f < 3)
> ~ fprintf (stderr, "failed to write to new stdout, %d\n", errno);
> ~ return 0;
>
>
> --
> Don't work too hard, make some time for fun as well!
>
> Eric Blake ebb9@byu.net
>
Attachment:
cygcheck.out
Description: cygcheck.out
-- Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple Problem reports: http://cygwin.com/problems.html Documentation: http://cygwin.com/docs.html FAQ: http://cygwin.com/faq/
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |