From: Peter Stephenson <p.w.stephenson@ntlworld.com>
To: zsh-workers@zsh.org
Subject: Re: How to misplace an entire pipeline
Date: Mon, 8 Aug 2011 19:27:20 +0100 [thread overview]
Message-ID: <20110808192720.380a3ee7@pws-pc.ntlworld.com> (raw)
In-Reply-To: <110807210507.ZM28821@torch.brasslantern.com>
On Sun, 07 Aug 2011 21:05:07 -0700
Bart Schaefer <schaefer@brasslantern.com> wrote:
> The following is clearly not a complete fix and maybe is even wrong if
> a different problem is fixed elsewhere, but this at least allows the
> suspended pipeline to be manipulated with jobs/fg/bg/wait.
>
> --- ../zsh-forge/current/Src/exec.c 2011-07-27 01:13:48.000000000 -0700
> +++ Src/exec.c 2011-08-07 19:07:59.000000000 -0700
> @@ -2845,7 +2845,9 @@
> /* This is a current shell procedure that didn't need to fork. *
> * This includes current shell procedures that are being exec'ed, *
> * as well as null execs. */
> - jobtab[thisjob].stat |= STAT_CURSH|STAT_NOPRINT;
> + jobtab[thisjob].stat |= STAT_CURSH;
> + if (!jobtab[thisjob].procs)
> + jobtab[thisjob].stat |= STAT_NOPRINT;
> } else {
> /* This is an exec (real or fake) for an external command. *
> * Note that any form of exec means that the subshell is fake *
Looks fairly plausible, anyway.
> When "read" is the tail of the pipe, the above all happens behind the
> scenes and then the I/O system call gets restarted, which is how the
> shell ends up stuck. I'm not sure how to escape from that, except
> maybe to have zhandler() kill the shell with a different signal from
> which the system call will not recover.
I suppose so. I can hardly believe this ever worked.
> When something like "true" is the tail of the pipe, we return into
> execpline at line 1500 (from waitjobs()), where list_pipe_job is set
> but list_pipe and list_pipe_child are not. If all three were nonzero,
> a dummy shell would be forked off as PWS described to act as the
> suspended job, but instead execpline() simply returns because the
> last job in the pipeline has exited.
>
> The only obvious thing I can think to do here is to note in zhandler()
> that we have STAT_CURSH but not list_pipe, and therefore SIGCONT the
> left-hand-side immediately and return as if no signal had occurred
> (possibly printing a warning about not being able to suspend the job,
> which is what happens elsewhere if pipe() or fork() fails). However,
> that could lead to a serious busy-loop if somehow TTIN or TTOU was
> the signal instead of TSTP.
But we can test if it's TSTP (or STOP)?
There are so many special cases here --- there's one for each state the
current shell might be in during the process, each of which would be
handled straighforwardly if the processing was in another shell --- that
even if it sometimes worked before it's not that surprising if it's
sensitive to knock-on effects. I suppose it would be nice to be able to
test the things that seem to be working, at least, which would need some
care and probably a bit of extra test framework.
--
Peter Stephenson <p.w.stephenson@ntlworld.com>
Web page now at http://homepage.ntlworld.com/p.w.stephenson/
next prev parent reply other threads:[~2011-08-08 18:52 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-08-06 3:31 Bart Schaefer
2011-08-07 17:50 ` Peter Stephenson
2011-08-07 21:43 ` Bart Schaefer
2011-08-08 4:05 ` Bart Schaefer
2011-08-08 18:27 ` Peter Stephenson [this message]
2011-08-09 6:10 ` Bart Schaefer
2011-08-09 20:19 ` Peter Stephenson
2011-08-13 18:52 ` Bart Schaefer
2011-08-13 20:15 ` Bart Schaefer
2011-09-12 13:51 ` Alexey I. Froloff
2011-09-12 16:03 ` Bart Schaefer
2011-09-12 16:18 ` Bart Schaefer
2011-09-12 16:35 ` Peter Stephenson
2011-09-15 14:57 ` Alexey I. Froloff
2011-09-16 16:16 ` Bart Schaefer
2011-09-12 16:27 ` Alexey I. Froloff
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=20110808192720.380a3ee7@pws-pc.ntlworld.com \
--to=p.w.stephenson@ntlworld.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).