st-externalpipe-sigaction-20200418-30e1771.diff (1428B)
1 From 103531d8ecaf98322a45d956bc13f9da5cd68853 Mon Sep 17 00:00:00 2001 2 From: Christian Tenllado <ctenllado@gmail.com> 3 Date: Sat, 18 Apr 2020 20:45:40 +0200 4 Subject: [PATCH] externalpipe sigaction 5 6 This patch should be applied on top of the externalpipe patch. It 7 prevents the reset of the signal handler set on SIGCHILD, when the 8 forked process that executes the external process exits. I opted for 9 switching from signal to sigaction instead of rearming the signal in the 10 sigchld function, just because it is the recommended function (although I 11 tried both ways and both worked). 12 --- 13 st.c | 8 ++++++-- 14 1 file changed, 6 insertions(+), 2 deletions(-) 15 16 diff --git a/st.c b/st.c 17 index ab291ac..0824894 100644 18 --- a/st.c 19 +++ b/st.c 20 @@ -712,7 +712,7 @@ sigchld(int a) 21 int stat; 22 pid_t p; 23 24 - if ((p = waitpid(pid, &stat, WNOHANG)) < 0) 25 + if ((p = waitpid(-1, &stat, WNOHANG)) < 0) 26 die("waiting for pid %hd failed: %s\n", pid, strerror(errno)); 27 28 if (pid != p) 29 @@ -753,6 +753,7 @@ int 30 ttynew(char *line, char *cmd, char *out, char **args) 31 { 32 int m, s; 33 + struct sigaction sa; 34 35 if (out) { 36 term.mode |= MODE_PRINT; 37 @@ -804,7 +805,10 @@ ttynew(char *line, char *cmd, char *out, char **args) 38 #endif 39 close(s); 40 cmdfd = m; 41 - signal(SIGCHLD, sigchld); 42 + memset(&sa, 0, sizeof(sa)); 43 + sigemptyset(&sa.sa_mask); 44 + sa.sa_handler = sigchld; 45 + sigaction(SIGCHLD, &sa, NULL); 46 break; 47 } 48 return cmdfd; 49 -- 50 2.20.1 51