From eba9be1b391c1fa87dd7557cf528ceaefd1f8d19 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Thu, 11 Feb 2021 15:25:22 -0700 Subject: [PATCH] cooperate with nohup If SIGHUP is initially ignored, don't set a SIGHUP handler. --- racket/src/bc/src/salloc.c | 8 ++++++++ racket/src/rktio/rktio_signal.c | 8 +++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/racket/src/bc/src/salloc.c b/racket/src/bc/src/salloc.c index 7d4f5150e4..549122071d 100644 --- a/racket/src/bc/src/salloc.c +++ b/racket/src/bc/src/salloc.c @@ -462,6 +462,14 @@ void scheme_set_signal_handler(int sig_id, Scheme_Signal_Handler_Proc proc) XFOR { #ifndef WINDOWS_PROCESSES struct sigaction sa; + + if (sig_id == SIGHUP) { + /* cooperate with `nohup` by keeping SIHGUP as-is when ignored */ + sigaction(SIGHUP, NULL, &sa); + if (sa.sa_handler == SIG_IGN) + return; + } + sigemptyset(&sa.sa_mask); sa.sa_flags = 0; sa.sa_handler = (proc ? proc : SIG_IGN); diff --git a/racket/src/rktio/rktio_signal.c b/racket/src/rktio/rktio_signal.c index 73448ebd7a..d0e20eb0b7 100644 --- a/racket/src/rktio/rktio_signal.c +++ b/racket/src/rktio/rktio_signal.c @@ -68,7 +68,13 @@ void rktio_install_os_signal_handler(rktio_t *rktio) #if defined(RKTIO_SYSTEM_UNIX) rktio_set_signal_handler(SIGINT, user_break_hit); rktio_set_signal_handler(SIGTERM, term_hit); - rktio_set_signal_handler(SIGHUP, hup_hit); + { + struct sigaction sa; + sigemptyset(&sa.sa_mask); + sigaction(SIGHUP, NULL, &sa); + if (sa.sa_handler != SIG_IGN) + rktio_set_signal_handler(SIGHUP, hup_hit); + } #endif #if defined(RKTIO_SYSTEM_WINDOWS)