Messages in this thread | | | Date | Wed, 11 Apr 2012 00:55:16 +0200 | From | Oleg Nesterov <> | Subject | Re: Hang opening a pipe written to by a child, with SIGCHLD |
| |
On 04/09, Andrew Morton wrote: > > Begin forwarded message: > > Date: Mon, 2 Apr 2012 16:46:11 +0200 > From: Lluís Batlle i Rossell <viric@viric.name> > To: linux-kernel@vger.kernel.org > Subject: Hang opening a pipe written to by a child, with SIGCHLD > > > Hello, > > I had troubles running a simple bash script where a child wrote to a named pipe > before dying, and the parent opened and read the pipe. > > On a computer, my script hangs always. Also under 'strace'. Not under 'strace > -f'. Thinking of some race, I wrote a small script that hangs in the linuxes I > could try (3.2.11 now): > > ---------- > #!/var/run/current-system/sw/bin/bash > > PIPE=/tmp/pipe > > rm -f $PIPE > mkfifo $PIPE > > function spawn { > echo DONE > $PIPE > } > > spawn sleep 1 & > > while true; do > echo reading > while read LINE < $PIPE; do > echo $LINE > spawn & > done > done
Looks like, it hangs "correctly". At least from the kernel pov.
The parent sleeps in fifo_open()->wait_for_partner(), but there are no pipe->writers.
Note that the parent (bash) re-opens /tmp/pipe after every "spawn". Now,
- the parent (bash) forks the new child
- the new child sleeps waiting for reader
- the parent does open(pipe), this wakes up the child
- the child opens the pipe, writes, and exits
- the open from the child wakes up the parent, but since it exits quickly fifo_open(FMODE_READ) can notice the pending SIGCHLD and return -EINTR
- the parent restarts sys_open(), but nobody can open it for writing
May be you can ask bash developers. Perhaps bash can move the "restore stdin" logic into the child process, I dunno.
Or may be you can "fix" this script, just add "exec < $PIPE" before the main "while true" loop.
Oleg.
-- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |