Re: RFC: [PATCH] ignore SIGINT&QUIT while waiting for external command
From: Jeff King <hidden>
Date: 2016-06-15 22:49:49
Subsystem:
the rest · Maintainer:
Linus Torvalds
On Tue, Oct 19, 2010 at 09:32:36AM -0400, Jeff King wrote:
How does this interact with the sigchain code? If I do: start_command(...); sigchain_push(...); finish_command(...); we will overwrite the function pushed in the sigchain_push with a stale handler. I think you could just replace your signal() calls with: sigchain_push(SIGINT, SIG_IGN); ... sigchain_pop(SIGINT);
Which, FWIW, would look like this:
diff --git a/run-command.c b/run-command.c
index 2a1041e..24e0f46 100644
--- a/run-command.c
+++ b/run-command.c@@ -1,6 +1,7 @@ #include "cache.h" #include "run-command.h" #include "exec_cmd.h" +#include "sigchain.h" static inline void close_pair(int fd[2]) {
@@ -102,6 +103,9 @@ 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 */ + sigchain_pop(SIGINT); + sigchain_pop(SIGQUIT); + if (waiting < 0) { failed_errno = errno; error("waitpid for %s failed: %s", argv0, strerror(errno));
@@ -202,8 +206,12 @@ fail_pipe: notify_pipe[0] = notify_pipe[1] = -1; fflush(NULL); + sigchain_push(SIGINT, SIG_IGN); + sigchain_push(SIGQUIT, SIG_IGN); cmd->pid = fork(); if (!cmd->pid) { + sigchain_pop(SIGINT); + sigchain_pop(SIGQUIT); /* * Redirect the channel to write syscall error messages to * before redirecting the process's stderr so that all die()