Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: [4.2/4.3] Bug with wait and trapped signals



In the last episode (Feb 17), Vincent Lefevre said:
> zsh (all versions?) does not interrupt a "wait" when it receives a
> signal for which a trap has been set.
> 
> For instance, consider the following script:
> 
> #!/usr/bin/env zsh
> echo "PID = $$"
> sleep 60 &
> trap 'echo term; exit 0' TERM
> wait

Here's the test I've been using.  All shells I've tested except zsh and
FreeBSD's ash interrupt the wait, but only bash returns the correct
value from wait #1.  I tested Solaris 10 /bin/sh and /bin/ksh, FreeBSD
5's /bin/sh, zsh-4.2.6 and ksh93-20060124 ports, and Debian's
bash-2.05b-14 and ash-0.5.2-5.

-- 
	Dan Nelson
	dnelson@xxxxxxxxxxxxxxx
#! /bin/sh
# 
SIG=15
echo "\
Correct order is:
 parent waiting on \$childpid
 child sending signal to \$parentpid
 parent received signal
 wait #1 finished, gotsig=1, status=a number > 128, possibly $(($SIG+128))
 child exiting
 wait #2 finished, gotsig=0, status=33
"
gotsig=0
signal_handler() {
 echo "parent received signal"
 gotsig=1
}
child() {
 sleep 2
 echo "child sending signal to pid $parentpid"
 kill -$SIG $parentpid
 sleep 2
 echo "child exiting" 
 exit 33
} 
parentpid=$$
echo "parent's pid is $parentpid"
child &
childpid=$!
trap signal_handler $SIG
echo "parent waiting on pid $childpid"
wait $childpid
cstatus=$?
echo "wait #1 finished, gotsig=$gotsig, status=$cstatus"
gotsig=0
wait $childpid
cstatus=$?
echo "wait #2 finished, gotsig=$gotsig, status=$cstatus"


Messages sorted by: Reverse Date, Date, Thread, Author