GNU bug report logs -
#54062
29.0.50; [PATCH] Eshell should inform processes when a pipe is broken
Previous Next
Reported by: Jim Porter <jporterbugs <at> gmail.com>
Date: Sat, 19 Feb 2022 04:21:01 UTC
Severity: normal
Tags: patch
Found in version 29.0.50
Fixed in version 29.1
Done: Lars Ingebrigtsen <larsi <at> gnus.org>
Bug is archived. No further changes may be made.
Full log
Message #11 received at 54062 <at> debbugs.gnu.org (full text, mbox):
[Message part 1 (text/plain, inline)]
On 2/19/2022 12:35 AM, Eli Zaretskii wrote:
>> From: Jim Porter <jporterbugs <at> gmail.com>
>> Date: Fri, 18 Feb 2022 20:20:10 -0800
>>
>> Consider the following shell command:
>>
>> yes | sh -c 'read NAME'
>>
>> Ordinarily, you'd expect that `sh' reads a single "y", exits, and then
>> the next time `yes' tries to write, it finds that the pipe was broken.
>> However, that's not what happens in Eshell. Running the above and then
>> calling `M-x list-processes' will show that `yes' is still running.
>>
>> Attached is a patch (with a test) to fix this by telling Eshell to
>> signal SIGPIPE at the appropriate time.
>
> SIGPIPE isn't supported on MS-Windows, so I think we should have a
> fallback there for platforms that don't support SIGPIPE.
Hmm, good point. Thinking about this some more, this also won't work for
Tramp (which only supports `interrupt-process' as far as I can tell). I
can think of a couple possible solutions.
One option would be to call `interrupt-process' instead, since that
works in all cases I'm aware of. This isn't quite as nice as sending
SIGPIPE (or equivalent) to let the process handle it how it wants, but
at least `interrupt-process' has the same default behavior as SIGPIPE
(i.e. terminate the process).
Another way would be to add a function like `process-break-pipe' (it
could probably use a better name) that would close the read end of the
process's output pipe, which - if I understand the Win32 API here -
should trigger the right behavior on MS Windows too. It should work for
Tramp too, although Tramp might need a bit of tweaking to handle this
case. I've attached an outline of what this could look like; it applies
on top of my previous patches.
One caveat is that the head process (`yes' in the example), would only
see the "broken pipe" error on the *next* write after the one where
Eshell detected the broken pipe. That's easy enough to fix for cases
where we can signal SIGPIPE directly, but it's probably ok in general
too: after all, processes don't generally know exactly when a SIGPIPE
might occur, so it occurring slightly later shouldn't cause problems.
(In theory, the tail process should call `process-break-pipe' as soon as
it closes, but in Eshell, the tail process doesn't know what's feeding
it input, so it can't easily do this.)
What do you think? Is this a sensible avenue to go down? There's
probably room to discuss what the API should look like, but I wanted to
be sure I was on the right track before I went too far.
[process-break-pipe.patch (text/plain, attachment)]
This bug report was last modified 3 years and 146 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.