+# Run the arguments as a command, in a process where stdout is a
+# dangling pipe and SIGPIPE has the default signal-handling action.
+# This can't be done portably in the shell, because if SIGPIPE is
+# ignored when the shell is entered, the shell might refuse to trap
+# it. Fall back on Perl+POSIX, if available. Take care to close the
+# pipe's read end before running the program; the equivalent of the
+# shell's "command | :" has a race condition in that COMMAND could
+# write before ":" exits.
+write_to_dangling_pipe () {
+ program=${1?}
+ shift
+ args=
+ for arg; do
+ args="$args, '$arg'"
+ done
+ "$PERL" -e '
+ use POSIX qw(dup2);
+ $SIG{PIPE} = "DEFAULT";
+ pipe my ($read_end, $write_end) or die "pipe: $!\n";
+ dup2 fileno $write_end, 1 or die "dup2: $!\n";
+ close $read_end or die "close: $!\n";
+ exec '"'$program'$args"';
+ '
+}
+
+write_to_dangling_pipe cat f.gz f.gz
+signal_status=$?
+test 128 -lt $signal_status ||
+ framework_failure_ 'signal handling busted on this host'