Re: RFC: [PATCH] ignore SIGINT&QUIT while waiting for external command
From: Jonathan Nieder <hidden>
Date: 2016-06-15 22:49:49
Subsystem:
the rest · Maintainer:
Linus Torvalds
Jeff King wrote:
On Tue, Oct 19, 2010 at 09:32:36AM -0400, Jeff King wrote:
quoted
I think you could just replace your signal() calls with: sigchain_push(SIGINT, SIG_IGN); ... sigchain_pop(SIGINT);Which, FWIW, would look like this:
Something in this direction on top? I think sigchain_push ought to accept a context object. Signed-off-by: Jonathan Nieder <redacted> ---
diff --git a/run-command.c b/run-command.c
index 24e0f46..efdac84 100644
--- a/run-command.c
+++ b/run-command.c@@ -103,6 +103,7 @@ static int wait_or_whine(pid_t pid, const char *argv0, int silent_exec_failure) while ((waiting = waitpid(pid, &status, 0)) < 0 && errno == EINTR) ; /* nothing */ + the_child = NULL; sigchain_pop(SIGINT); sigchain_pop(SIGQUIT);
@@ -139,6 +140,19 @@ static int wait_or_whine(pid_t pid, const char *argv0, int silent_exec_failure) return code; } +static struct child_process *the_child; + +static void interrupted_with_child(int sig) +{ + if (the_child && the_child->pid > 0) { + while ((waiting = waitpid(pid, NULL, 0)) < 0 && errno == EINTR) + ; /* nothing */ + the_child = NULL; + } + sigchain_pop(sig); + raise(sig); +} + int start_command(struct child_process *cmd) { int need_in, need_out, need_err;
@@ -206,8 +220,11 @@ fail_pipe: notify_pipe[0] = notify_pipe[1] = -1; fflush(NULL); - sigchain_push(SIGINT, SIG_IGN); - sigchain_push(SIGQUIT, SIG_IGN); + if (the_child) + die("What? _Two_ children?"); + the_child = cmd; + sigchain_push(SIGINT, interrupted_with_child); + sigchain_push(SIGQUIT, interrupted_with_child); cmd->pid = fork(); if (!cmd->pid) { sigchain_pop(SIGINT);