Re: RFC: [PATCH] ignore SIGINT&QUIT while waiting for external command
On Tue, Oct 19, 2010 at 09:32:36AM -0400, Jeff King wrote:
Show 12 quoted lines
> 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()