xref: /onnv-gate/usr/src/lib/libshell/common/tests/sigchld.sh (revision 12068:08a39a083754)
18462SApril.Chin@Sun.COM########################################################################
28462SApril.Chin@Sun.COM#                                                                      #
38462SApril.Chin@Sun.COM#               This software is part of the ast package               #
4*12068SRoger.Faulkner@Oracle.COM#          Copyright (c) 1982-2010 AT&T Intellectual Property          #
58462SApril.Chin@Sun.COM#                      and is licensed under the                       #
68462SApril.Chin@Sun.COM#                  Common Public License, Version 1.0                  #
78462SApril.Chin@Sun.COM#                    by AT&T Intellectual Property                     #
88462SApril.Chin@Sun.COM#                                                                      #
98462SApril.Chin@Sun.COM#                A copy of the License is available at                 #
108462SApril.Chin@Sun.COM#            http://www.opensource.org/licenses/cpl1.0.txt             #
118462SApril.Chin@Sun.COM#         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         #
128462SApril.Chin@Sun.COM#                                                                      #
138462SApril.Chin@Sun.COM#              Information and Software Systems Research               #
148462SApril.Chin@Sun.COM#                            AT&T Research                             #
158462SApril.Chin@Sun.COM#                           Florham Park NJ                            #
168462SApril.Chin@Sun.COM#                                                                      #
178462SApril.Chin@Sun.COM#                  David Korn <dgk@research.att.com>                   #
188462SApril.Chin@Sun.COM#                                                                      #
198462SApril.Chin@Sun.COM########################################################################
208462SApril.Chin@Sun.COMfunction err_exit
218462SApril.Chin@Sun.COM{
228462SApril.Chin@Sun.COM	print -u2 -n "\t"
238462SApril.Chin@Sun.COM	print -u2 -r ${Command}[$1]: "${@:2}"
248462SApril.Chin@Sun.COM	(( Errors+=1 ))
258462SApril.Chin@Sun.COM}
268462SApril.Chin@Sun.COM
278462SApril.Chin@Sun.COMalias err_exit='err_exit $LINENO'
288462SApril.Chin@Sun.COM
29*12068SRoger.Faulkner@Oracle.COMfloat DELAY=${1:-0.2}
308462SApril.Chin@Sun.COMinteger FOREGROUND=10 BACKGROUND=2 Errors=0
318462SApril.Chin@Sun.COM
328462SApril.Chin@Sun.COMs=$($SHELL -c '
338462SApril.Chin@Sun.COMinteger i foreground=0 background=0
348462SApril.Chin@Sun.COMfloat delay='$DELAY' d=0 s=0
358462SApril.Chin@Sun.COM
368462SApril.Chin@Sun.COMset --errexit
378462SApril.Chin@Sun.COM
388462SApril.Chin@Sun.COMtrap "(( background++ ))" CHLD
398462SApril.Chin@Sun.COM
408462SApril.Chin@Sun.COM(( d = delay ))
418462SApril.Chin@Sun.COMfor ((i = 0; i < '$BACKGROUND'; i++))
428462SApril.Chin@Sun.COMdo	sleep $d &
438462SApril.Chin@Sun.COM	(( d *= 4 ))
448462SApril.Chin@Sun.COM	(( s += d ))
458462SApril.Chin@Sun.COMdone
468462SApril.Chin@Sun.COMfor ((i = 0; i < '$FOREGROUND'; i++))
478462SApril.Chin@Sun.COMdo	(( foreground++ ))
488462SApril.Chin@Sun.COM	sleep $delay
498462SApril.Chin@Sun.COM	(( s -= delay ))
508462SApril.Chin@Sun.COM	$SHELL -c : > /dev/null # foreground does not generate SIGCHLD
518462SApril.Chin@Sun.COMdone
528462SApril.Chin@Sun.COMif	(( (s += delay) < 1 ))
538462SApril.Chin@Sun.COMthen	(( s = 1 ))
548462SApril.Chin@Sun.COMfi
558462SApril.Chin@Sun.COMsleep $s
568462SApril.Chin@Sun.COMwait
578462SApril.Chin@Sun.COMprint foreground=$foreground background=$background
588462SApril.Chin@Sun.COM') || err_exit "test loop failed"
598462SApril.Chin@Sun.COM
608462SApril.Chin@Sun.COMeval $s
618462SApril.Chin@Sun.COM
6210898Sroland.mainz@nrubsig.org(( foreground == FOREGROUND )) || err_exit "expected '$FOREGROUND foreground' -- got '$foreground' (DELAY=$DELAY)"
6310898Sroland.mainz@nrubsig.org(( background == BACKGROUND )) || err_exit "expected '$BACKGROUND background' -- got '$background' (DELAY=$DELAY)"
6410898Sroland.mainz@nrubsig.org
6510898Sroland.mainz@nrubsig.orgset --noerrexit
6610898Sroland.mainz@nrubsig.org
6710898Sroland.mainz@nrubsig.orgif	[[ ${.sh.version} == Version?*([[:upper:]])J* ]]
6810898Sroland.mainz@nrubsig.orgthen
6910898Sroland.mainz@nrubsig.org
7010898Sroland.mainz@nrubsig.org	jobmax=4
7110898Sroland.mainz@nrubsig.org	got=$($SHELL -c '
7210898Sroland.mainz@nrubsig.org		JOBMAX='$jobmax' JOBCOUNT=$(('$jobmax'*2))
7310898Sroland.mainz@nrubsig.org		integer running=0 maxrunning=0
7410898Sroland.mainz@nrubsig.org		trap "((running--))" CHLD
7510898Sroland.mainz@nrubsig.org		for ((i=0; i<JOBCOUNT; i++))
7610898Sroland.mainz@nrubsig.org		do	sleep 1 &
7710898Sroland.mainz@nrubsig.org			if	((++running > maxrunning))
7810898Sroland.mainz@nrubsig.org			then	((maxrunning=running))
7910898Sroland.mainz@nrubsig.org			fi
8010898Sroland.mainz@nrubsig.org		done
8110898Sroland.mainz@nrubsig.org		wait
8210898Sroland.mainz@nrubsig.org		print running=$running maxrunning=$maxrunning
8310898Sroland.mainz@nrubsig.org	')
8410898Sroland.mainz@nrubsig.org	exp='running=0 maxrunning='$jobmax
8510898Sroland.mainz@nrubsig.org	[[ $got == $exp ]] || err_exit "SIGCHLD trap queueing failed -- expected '$exp', got '$got'"
8610898Sroland.mainz@nrubsig.org
8710898Sroland.mainz@nrubsig.org	got=$($SHELL -c '
8810898Sroland.mainz@nrubsig.org		typeset -A proc
8910898Sroland.mainz@nrubsig.org
9010898Sroland.mainz@nrubsig.org		trap "
9110898Sroland.mainz@nrubsig.org			print \${proc[\$!].name} \${proc[\$!].status} \$?
9210898Sroland.mainz@nrubsig.org			unset proc[\$!]
9310898Sroland.mainz@nrubsig.org		" CHLD
9410898Sroland.mainz@nrubsig.org
9510898Sroland.mainz@nrubsig.org		{ sleep 3; print a; exit 1; } &
9610898Sroland.mainz@nrubsig.org		proc[$!]=( name=a status=1 )
9710898Sroland.mainz@nrubsig.org
9810898Sroland.mainz@nrubsig.org		{ sleep 2; print b; exit 2; } &
9910898Sroland.mainz@nrubsig.org		proc[$!]=( name=b status=2 )
10010898Sroland.mainz@nrubsig.org
10110898Sroland.mainz@nrubsig.org		{ sleep 1; print c; exit 3; } &
10210898Sroland.mainz@nrubsig.org		proc[$!]=( name=c status=3 )
10310898Sroland.mainz@nrubsig.org
10410898Sroland.mainz@nrubsig.org		while	(( ${#proc[@]} ))
10510898Sroland.mainz@nrubsig.org		do	sleep -s
10610898Sroland.mainz@nrubsig.org		done
10710898Sroland.mainz@nrubsig.org	')
10810898Sroland.mainz@nrubsig.org	exp='c\nc 3 3\nb\nb 2 2\na\na 1 1'
10910898Sroland.mainz@nrubsig.org	[[ $got == $exp ]] || err_exit "SIGCHLD trap queueing failed -- expected $(printf %q "$exp"), got $(printf %q "$got")"
11010898Sroland.mainz@nrubsig.org
11110898Sroland.mainz@nrubsig.orgfi
1128462SApril.Chin@Sun.COM
113*12068SRoger.Faulkner@Oracle.COM{
114*12068SRoger.Faulkner@Oracle.COMgot=$( ( sleep 1;print $'\n') | $SHELL -c 'function handler { : ;}
115*12068SRoger.Faulkner@Oracle.COM	trap handler CHLD; sleep .3 & IFS= read; print good')
116*12068SRoger.Faulkner@Oracle.COM} 2> /dev/null
117*12068SRoger.Faulkner@Oracle.COM[[ $got == good ]] || err_exit 'SIGCLD handler effects read behavior'
118*12068SRoger.Faulkner@Oracle.COM
119*12068SRoger.Faulkner@Oracle.COMset -- $(
120*12068SRoger.Faulkner@Oracle.COM	(
121*12068SRoger.Faulkner@Oracle.COM	$SHELL -xc $'
122*12068SRoger.Faulkner@Oracle.COM		trap \'wait $!; print $! $?\' CHLD
123*12068SRoger.Faulkner@Oracle.COM		{ sleep 0.1; exit 9; } &
124*12068SRoger.Faulkner@Oracle.COM		print $!
125*12068SRoger.Faulkner@Oracle.COM		sleep 0.5
126*12068SRoger.Faulkner@Oracle.COM	'
127*12068SRoger.Faulkner@Oracle.COM	) 2>/dev/null; print $?
128*12068SRoger.Faulkner@Oracle.COM)
129*12068SRoger.Faulkner@Oracle.COMif	(( $# != 4 ))
130*12068SRoger.Faulkner@Oracle.COMthen	err_exit "CHLD trap failed -- expected 4 args, got $#"
131*12068SRoger.Faulkner@Oracle.COMelif	(( $4 != 0 ))
132*12068SRoger.Faulkner@Oracle.COMthen	err_exit "CHLD trap failed -- exit code $4"
133*12068SRoger.Faulkner@Oracle.COMelif	(( $1 != $2 ))
134*12068SRoger.Faulkner@Oracle.COMthen	err_exit "child pid mismatch -- got '$1' != '$2'"
135*12068SRoger.Faulkner@Oracle.COMelif	(( $3 != 9 ))
136*12068SRoger.Faulkner@Oracle.COMthen	err_exit "child status mismatch -- expected '9', got '$3'"
137*12068SRoger.Faulkner@Oracle.COMfi
138*12068SRoger.Faulkner@Oracle.COM
1398462SApril.Chin@Sun.COMexit $((Errors))
140