All of lore.kernel.org
 help / color / mirror / Atom feed
From: Oleg Nesterov <oleg@redhat.com>
To: "Andrew Morton" <akpm@linux-foundation.org>,
	"Lluís Batlle i Rossell" <viric@viric.name>
Cc: linux-kernel@vger.kernel.org
Subject: Re: Hang opening a pipe written to by a child, with SIGCHLD
Date: Wed, 11 Apr 2012 00:55:16 +0200	[thread overview]
Message-ID: <20120410225516.GA13486@redhat.com> (raw)
In-Reply-To: <20120409120326.f0ce7a94.akpm@linux-foundation.org>

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.


       reply	other threads:[~2012-04-10 22:55 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20120409120326.f0ce7a94.akpm@linux-foundation.org>
2012-04-10 22:55 ` Oleg Nesterov [this message]
2012-04-10 23:12   ` Hang opening a pipe written to by a child, with SIGCHLD Oleg Nesterov
2012-04-02 14:46 Lluís Batlle i Rossell
2012-04-02 14:49 ` Shea Levy
2012-04-02 18:50   ` Lluís Batlle i Rossell
2012-04-02 20:20     ` Lluís Batlle i Rossell

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=20120410225516.GA13486@redhat.com \
    --to=oleg@redhat.com \
    --cc=akpm@linux-foundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=viric@viric.name \
    /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.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.