From: Stephane Chazelas <stephane.chazelas@gmail.com>
To: Zsh hackers list <zsh-workers@zsh.org>
Subject: fd used for saving redirected fds leaked to child processes
Date: Sun, 13 Aug 2017 17:12:07 +0100 [thread overview]
Message-ID: <20170813161207.GA6530@chaz.gmail.com> (raw)
In:
mkfifo fifo
zsh -c '{ echo GO > fifo & echo $!; } > pid; echo done' | cat
"cat" hangs until some process open the fifo in read mode, even
though that "echo GO > fifo" command was run in background and
"done" is output straight away.
What we see is the child zsh process opening the "fifo" having
a fd open on the pipe to cat:
zsh 28400 chazelas 12w FIFO 0,10 0t0 125690 pipe 28399,cat,0r
I think that fd was the one that was dupped from stdout by its
parent to /save/ stdout before doing the > pid redirection (so
it can be used to restore stdout after the command group
returns).
That fd is not needed/used in the child so should be closed
there.
(here, the work around and more obvious way to do it is with
zsh -c 'echo GO > fifo & echo $! > pid; echo done' | cat
that was just an example to illustrate the problem).
bash and dash seem to also have the problem. pdksh, ksh93 and
yash are OK. Looking at strace outputs, they seem to be closing
those fds in the children.
The Bourne shell and rc are OK, but only because they don't use
a dupped fd to "save" stdout when redirecting compound commands.
They run the compound command in a subshell.
Note that those fds have the CLOEXEC flag, so the circumstances
in which it becomes a problem are few.
--
Stephane
next reply other threads:[~2017-08-13 16:12 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-08-13 16:12 Stephane Chazelas [this message]
2017-08-13 18:49 ` Bart Schaefer
2017-08-13 18:49 ` Peter Stephenson
2017-08-13 21:45 ` Bart Schaefer
2017-08-14 9:09 ` Peter Stephenson
2017-08-14 14:49 ` Bart Schaefer
2017-08-14 15:24 ` Peter Stephenson
2017-08-14 15:31 ` Bart Schaefer
2017-08-14 19:19 ` Peter Stephenson
2017-09-29 15:06 ` Daniel Shahaf
2017-09-29 15:18 ` Peter Stephenson
2017-08-15 18:42 ` Peter Stephenson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170813161207.GA6530@chaz.gmail.com \
--to=stephane.chazelas@gmail.com \
--cc=zsh-workers@zsh.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.vuxu.org/mirror/zsh/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).