diff options
author | Steve Bennett <steveb@workware.net.au> | 2019-08-21 11:27:56 +1000 |
---|---|---|
committer | Steve Bennett <steveb@workware.net.au> | 2019-09-06 20:08:58 +1000 |
commit | ca4fa3865a730857b385e6e34af67db3471e0089 (patch) | |
tree | f0489c0f53f865c747461455a3955e98e0ae9d62 /tests/exec2.test | |
parent | 4dc539a582764fc4ae6788fc3f1dc0e6e7cd95d4 (diff) | |
download | jimtcl-ca4fa3865a730857b385e6e34af67db3471e0089.zip jimtcl-ca4fa3865a730857b385e6e34af67db3471e0089.tar.gz jimtcl-ca4fa3865a730857b385e6e34af67db3471e0089.tar.bz2 |
signal: Add 'signal block' support
This allows a signal to be blocked by setting it's handler to SIG_IGN
Can be used to block SIGPIPE for exec
Signed-off-by: Steve Bennett <steveb@workware.net.au>
Diffstat (limited to 'tests/exec2.test')
-rw-r--r-- | tests/exec2.test | 32 |
1 files changed, 25 insertions, 7 deletions
diff --git a/tests/exec2.test b/tests/exec2.test index 08f3d11..b4b42cc 100644 --- a/tests/exec2.test +++ b/tests/exec2.test @@ -5,12 +5,15 @@ source [file dirname [info script]]/testing.tcl needs cmd exec +foreach i {pipe signal wait} { + testConstraint $i [expr {[info commands $i] ne ""}] +} # Some Windows platforms (e.g. AppVeyor) produce ENOSPC rather than killing # the child with SIGPIPE). So turn off this test for that platform -if {[info commands pipe] ne "" && [env MSYSTEM ""] ne "MINGW32"} { - testConstraint pipe 1 +if {[info exists env(MSYSTEM)] && $env(MSYSTEM) eq "MINGW32"} { + testConstraint nomingw32 0 } else { - testConstraint pipe 0 + testConstraint nomingw32 1 } set d \" @@ -58,7 +61,7 @@ test exec2-3.1 "close pipeline return value" { list $rc $msg $status $exitcode } {1 {child process exited abnormally} CHILDSTATUS 1} -test exec2-3.2 "close pipeline return value" -constraints pipe -body { +test exec2-3.2 "close pipeline return value" -constraints {pipe nomingw32} -body { # Create a pipe and immediately close the read end lassign [pipe] r w close $r @@ -71,7 +74,23 @@ test exec2-3.2 "close pipeline return value" -constraints pipe -body { list $rc $msg $status $exitcode } -match glob -result {1 {child killed*} CHILDKILLED SIGPIPE} -test exec2-3.4 "wait for background task" { +test exec2-3.3 "close pipeline with SIGPIPE blocked" -constraints {pipe signal nomingw32} -body { + # Create a pipe and immediately close the read end + lassign [pipe] r w + close $r + signal block SIGPIPE + # Write more than 64KB which is maximum size of the pipe buffers + # on all systems we have seen + set bigstring [string repeat a 100000] + set f [open [list |cat << $bigstring >$@w 2>/dev/null]] + set rc [catch {close $f} msg opts] + lassign [dict get $opts -errorcode] status pid exitcode + list $rc $msg $status $exitcode +} -match glob -result {1 {child process exited*} CHILDSTATUS 1} -cleanup { + signal default SIGPIPE +} + +test exec2-3.4 "wait for background task" -constraints wait -body { set pid [exec sleep 0.1 &] lassign [wait $pid] status newpid exitcode if {$pid != $newpid} { @@ -79,7 +98,6 @@ test exec2-3.4 "wait for background task" { } else { list $status $exitcode } -} {CHILDSTATUS 0} - +} -result {CHILDSTATUS 0} testreport |