* tests/env/env-signal-handler.sh: Test that --ignore-signal with no
options also ignores real-time signals. Test that real-time signals can
be explicitly be ignored by listing them.
---
 tests/env/env-signal-handler.sh | 59 +++++++++++++++++++++++++++++++++
 1 file changed, 59 insertions(+)

diff --git a/tests/env/env-signal-handler.sh b/tests/env/env-signal-handler.sh
index 77d556457..d77f47a5a 100755
--- a/tests/env/env-signal-handler.sh
+++ b/tests/env/env-signal-handler.sh
@@ -19,6 +19,7 @@
 . "${srcdir=.}/tests/init.sh"; path_prepend_ ./src
 print_ver_ env seq test timeout printf
 trap_sigpipe_or_skip_
+getlimits_
 
 # /bin/sh has an intermittent failure in ignoring SIGPIPE on OpenIndiana 11
 # so we require bash as discussed at:
@@ -128,6 +129,64 @@ EOF
 timeout_sig=PIPE env_opt='--ignore-signal=PIPE' \
   retry_delay_ env_ignore_delay_ .1 6 || fail=1
 
+# If the system's signal.h defines SIGRTMIN and SIGRTMAX, assume that real-time
+# signals are supported.
+if test $SIGRTMIN -gt 0 && test $SIGRTMAX -gt $SIGRTMIN; then
+  # Find the lowest supported signal number used for real-time signals.
+  for i in $(seq $SIGRTMIN $SIGRTMAX); do
+    if test $i -eq $SIGRTMIN; then
+      sig=RTMIN
+    else
+      sig=RTMIN+$(($i - $SIGRTMIN))
+    fi
+    if kill -l $sig; then
+      rtmin_signal=$sig
+      break
+    fi
+  done
+
+  # Find the largest supported signal number used for real-time signals.
+  for i in $(seq $SIGRTMAX -1 $SIGRTMIN); do
+    if test $i -eq $SIGRTMAX; then
+      sig=RTMAX
+    else
+      sig=RTMAX-$(($SIGRTMAX - $i))
+    fi
+    if kill -l $sig; then
+      rtmax_signal=$sig
+      break
+    fi
+  done
+
+  # Fail if we could not find a supported real-time signal using 'kill'.
+  test -n "$rtmin_signal" && test -n "$rtmax_signal" || framework_failure_
+
+  for sig in $rtmin_signal $rtmax_signal; do
+    # Baseline test - ignore signal handler
+    # -------------------------------------
+    # Terminate 'sleep' with $sig
+    # All real-time signals terminate the program by default.
+    cat <<EOF >exp || framework_failure_
+timeout: sending signal $sig to command 'env'
+EOF
+    timeout_sig=$sig env_opt='' \
+      retry_delay_ env_ignore_delay_ .1 6 || fail=1
+
+    # env test - ignore signal handler
+    # --------------------------------
+    # Use env to ignore real-time signals - "sleep" should continue running
+    # after timeout sends $sig, and be killed using SIGKILL.
+    cat <<EOF >exp || framework_failure_
+timeout: sending signal $sig to command 'env'
+timeout: sending signal KILL to command 'env'
+EOF
+    timeout_sig=$sig env_opt="--ignore-signal=$sig" \
+      retry_delay_ env_ignore_delay_ .1 6 || fail=1
+    timeout_sig=$sig env_opt='--ignore-signal' \
+      retry_delay_ env_ignore_delay_ .1 6 || fail=1
+  done
+fi
+
 # env test --list-signal-handling
 for sig in INT PIPE; do
   env --default-signal --ignore-signal=$sig --list-signal-handling true \
-- 
2.52.0


Reply via email to