Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

wl-copy: ignore SIGINT when backgrounded #220

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

krobelus
Copy link

Given a command like

echo foo | wl-copy

Unlike bash, the fish shell puts wl-copy in the shell's process
group 1, which can be observed with "ps -o pid,pgid,comm,args".
On VSCode's integrated terminal, this causes the issue that Control+C
will kill wl-copy, clearing the clipboard. fish has worked around
this2 but still we should fix the command described above.
I'll try to look into changing the fish behavior but chances are
it's complicated.

Let's block SIGINT and SIGQUIT in the background process.
This will make wl-copy behave as if launched as

bash -c "wl-copy &"

because according to Bash documentation3 that's how background
commands in noninteractive shells should behave:

When job control is not in effect, asynchronous commands ignore
SIGINT and SIGQUIT in addition to these inherited handlers.

fish implements this too, but the bug happens on interactive shells.

Given a command like

    echo foo | wl-copy

Unlike bash, the fish shell puts wl-copy in the shell's process
group [1], which can be observed with "ps -o pid,pgid,comm,args".
On VSCode's integrated terminal, this causes the issue that Control+C
will kill wl-copy, clearing the clipboard. fish has worked around
this[2] but still we should fix the command described above.
I'll try to look into changing the fish behavior but chances are
it's complicated.

Let's block SIGINT and SIGQUIT in the background process.
This will make wl-copy behave as if launched as

    bash -c "wl-copy &"

because according to Bash documentation[3] that's how background
commands in noninteractive shells should behave:

> When job control is not in effect, asynchronous commands ignore
> SIGINT and SIGQUIT in addition to these inherited handlers.

fish implements this too, but the bug happens on interactive shells.

[1]: fish-shell/fish-shell@f3736e8
[2]: fish-shell/fish-shell@b3444ea
[3]: https://www.gnu.org/software/bash/manual/html_node/Signals.html
@krobelus
Copy link
Author

alternatively we could call setsid in the forked child, and perhaps double-fork additionally (for some added safety)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
1 participant