]> granicus.if.org Git - procps-ng/commitdiff
top: ignore the SIGHUP signal if running in batch mode <=== port of newlib 6aec3ec9
authorJim Warner <james.warner@comcast.net>
Wed, 15 Jun 2022 05:00:00 +0000 (00:00 -0500)
committerCraig Small <csmall@dropbear.xyz>
Sun, 19 Jun 2022 10:58:51 +0000 (20:58 +1000)
______________________________ original newlib message

It would appear that openSUSE was the first to release
procps-ng version 4.0.0 (in the tumbleweed distro). As
a result I checked their source rpm and found a couple
of patches I'm porting to newlib for the next release.

This particulate commit was a refactor of the openSUSE
patch 'procps-ng-3.3.8-bnc634840.patch'. Unfortunately
their original patch did not have the intended effect.

That was because the amended signal handling logic was
performed well before the command line parameters were
parsed. So the global 'Batch' flag was in its 0 state.

. what follows is the original openSUSE commit message
------------------------------------------------------
Do not setup SIGHUP signal handler if we are in the batch mode

Top enables a signal handler for the SIGHUP signal (loss of terminal).  While
this makes sense for top's default interactive mode, it doesn't make any sense
for batch mode. If you run top in nohup just to collect data over time and
disconnect top finishes which is not what one would expect.
------------------------------------------------------

Signed-off-by: Jim Warner <james.warner@comcast.net>
top/top.c
top/top.h

index edd3b38f4ce74a3ca470803fe4e3654c2829594f..ce32616d6d2412ceb30eddedcf562a86d9811d3a 100644 (file)
--- a/top/top.c
+++ b/top/top.c
@@ -3738,7 +3738,6 @@ static inline int osel_matched (const WIN_t *q, FLG_t enu, const char *str) {
          * No matter what *they* say, we handle the really really BIG and
          * IMPORTANT stuff upon which all those lessor functions depend! */
 static void before (char *me) {
-   struct sigaction sa;
    proc_t p;
    int i;
 #ifndef PRETEND2_5_X
@@ -3786,43 +3785,6 @@ static void before (char *me) {
    memcpy(HHash_one, HHash_nul, sizeof(HHash_nul));
    memcpy(HHash_two, HHash_nul, sizeof(HHash_nul));
 #endif
-
-   numa_init();
-#ifndef PRETEND0NUMA
-   Numa_node_tot = numa_max_node() + 1;
-#endif
-
-#ifndef SIGRTMAX       // not available on hurd, maybe others too
-#define SIGRTMAX 32
-#endif
-   // lastly, establish a robust signals environment
-   memset(&sa, 0, sizeof(sa));
-   sigemptyset(&sa.sa_mask);
-   // with user position preserved through SIGWINCH, we must avoid SA_RESTART
-   sa.sa_flags = 0;
-   for (i = SIGRTMAX; i; i--) {
-      switch (i) {
-         case SIGALRM: case SIGHUP:  case SIGINT:
-         case SIGPIPE: case SIGQUIT: case SIGTERM:
-         case SIGUSR1: case SIGUSR2:
-            sa.sa_handler = sig_endpgm;
-            break;
-         case SIGTSTP: case SIGTTIN: case SIGTTOU:
-            sa.sa_handler = sig_paused;
-            break;
-         case SIGCONT: case SIGWINCH:
-            sa.sa_handler = sig_resize;
-            break;
-         default:
-            sa.sa_handler = sig_abexit;
-            break;
-         case SIGKILL: case SIGSTOP:
-         // because uncatchable, fall through
-         case SIGCHLD: // we can't catch this
-            continue;  // when opening a pipe
-      }
-      sigaction(i, &sa, NULL);
-   }
 } // end: before
 
 
@@ -4456,6 +4418,51 @@ static void parse_args (int argc, char **argv) {
 } // end: parse_args
 
 
+        /*
+         * Establish a robust signals environment */
+static void signals_set (void) {
+ #ifndef SIGRTMAX       // not available on hurd, maybe others too
+  #define SIGRTMAX 32
+ #endif
+   int i;
+   struct sigaction sa;
+
+   memset(&sa, 0, sizeof(sa));
+   sigemptyset(&sa.sa_mask);
+   // with user position preserved through SIGWINCH, we must avoid SA_RESTART
+   sa.sa_flags = 0;
+   for (i = SIGRTMAX; i; i--) {
+      switch (i) {
+         case SIGHUP:
+            if (Batch)
+               sa.sa_handler = SIG_IGN;
+            else
+               sa.sa_handler = sig_endpgm;
+            break;
+         case SIGALRM: case SIGINT:  case SIGPIPE:
+         case SIGQUIT: case SIGTERM: case SIGUSR1:
+         case SIGUSR2:
+            sa.sa_handler = sig_endpgm;
+            break;
+         case SIGTSTP: case SIGTTIN: case SIGTTOU:
+            sa.sa_handler = sig_paused;
+            break;
+         case SIGCONT: case SIGWINCH:
+            sa.sa_handler = sig_resize;
+            break;
+         default:
+            sa.sa_handler = sig_abexit;
+            break;
+         case SIGKILL: case SIGSTOP:
+         // because uncatchable, fall through
+         case SIGCHLD: // we can't catch this
+            continue;  // when opening a pipe
+      }
+      sigaction(i, &sa, NULL);
+   }
+} // end: signals_set
+
+
         /*
          * Set up the terminal attributes */
 static void whack_terminal (void) {
@@ -6867,8 +6874,9 @@ int main (int argc, char *argv[]) {
                                         //                 +-------------+
    wins_stage_1();                      //                 top (sic) slice
    configs_reads();                     //                 > spread etc, <
-   parse_args(argc, argv);              //                 > lean stuff, <
-   whack_terminal();                    //                 > onions etc. <
+   parse_args(argc, argv);              //                 > onions etc, <
+   signals_set();                       //                 > lean stuff, <
+   whack_terminal();                    //                 > more stuff. <
    wins_stage_2();                      //                 as bottom slice
                                         //                 +-------------+
 
index ea93c058d6da5f2379afac6ded88f35c184aacdc..e596d630aeac85231afc1a47cc6ff0611c552c6d 100644 (file)
--- a/top/top.h
+++ b/top/top.h
@@ -797,6 +797,7 @@ typedef struct WIN_t {
 //atic int           configs_path (const char *const fmts, ...);
 //atic void          configs_reads (void);
 //atic void          parse_args (int argc, char **argv);
+//atic void          signals_set (void);
 //atic void          whack_terminal (void);
 /*------  Windows/Field Groups support  ----------------------------------*/
 //atic void          win_names (WIN_t *q, const char *name);