summaryrefslogtreecommitdiff
path: root/man
diff options
context:
space:
mode:
authorAssaf Gordon <assafgordon@gmail.com>2019-02-15 12:31:48 -0700
committerPádraig Brady <P@draigBrady.com>2019-03-04 00:37:07 -0800
commit95adadd9a420812ddd3f0fc6105f668922a97ae5 (patch)
tree7776675d03905503ace0005d62e6eff2a3d08803 /man
parent186896d65f6182dff15cad6c1045d22ad2004962 (diff)
downloadcoreutils-95adadd9a420812ddd3f0fc6105f668922a97ae5.tar.gz
env: new options --{default,ignore,block}-signal[=SIG]
New options to set signal handlers for the command being executed. --block-signal suggested by Paul Eggert in http://bugs.gnu.org/34488#71 --default-signal is useful to overcome the POSIX limitation that shell must not override inherited signal state, e.g. the second 'trap' here is a no-op: trap '' PIPE && sh -c 'trap - PIPE ; seq inf | head -n1' Instead use: trap '' PIPE && sh -c 'env --default-signal=PIPE seq inf | head -n1' Similarly, the following will prevent CTRL-C from terminating the program: env --ignore-signal=INT seq inf > /dev/null See https://bugs.gnu.org/34488#8 * NEWS: Mention new options. * doc/coreutils.texi (env invocation): Document new options. * man/env.x: Add example of --default-signal=SIG usage. (SEE ALSO): Mention sigprocmask. * src/env.c (signals): New global variable. (longopts): Add new options. (usage): Print new options. (parse_signal_params): Parse comma-separated list of signals, store in signals variable. (reset_signal_handlers): Set each signal to SIG_DFL/SIG_IGN. (parse_block_signal_params): Parse command-line options. (set_signal_proc_mask): Call sigprocmask to block/unblock signals. (main): Process new options. * src/local.mk (src_env_SOURCES): Add operand2sig.c. * tests/misc/env-signal-handler.sh: New test. * tests/local.mk (all_tests): Add new test.
Diffstat (limited to 'man')
-rw-r--r--man/env.x28
1 files changed, 28 insertions, 0 deletions
diff --git a/man/env.x b/man/env.x
index 8eea79655..92dfe6aa1 100644
--- a/man/env.x
+++ b/man/env.x
@@ -37,3 +37,31 @@ parameter the script will likely fail with:
.RE
.PP
See the full documentation for more details.
+.PP
+.SS "\-\-default-signal[=SIG]" usage
+This option allows setting a signal handler to its default
+action, which is not possible using the traditional shell
+trap command. The following example ensures that seq
+will be terminated by SIGPIPE no matter how this signal
+is being handled in the process invoking the command.
+
+.PP
+.RS
+.nf
+sh \-c 'env \-\-default-signal=PIPE seq inf | head \-n1'
+.fi
+.RE
+.PP
+
+[NOTES]
+POSIX's exec(2) pages says:
+.RS
+"many existing applications wrongly assume that they start with certain
+signals set to the default action and/or unblocked.... Therefore, it is best
+not to block or ignore signals across execs without explicit reason to do so,
+and especially not to block signals across execs of arbitrary (not closely
+cooperating) programs."
+.RE
+
+[SEE ALSO]
+sigaction(2), sigprocmask(2), signal(7)