1#!./perl 2 3##################################################################### 4# 5# Test for process id return value from open 6# Ronald Schmidt (The Software Path) RonaldWS@software-path.com 7# 8##################################################################### 9 10BEGIN { 11 chdir 't' if -d 't'; 12 @INC = '../lib'; 13 if ($^O eq 'dos') { 14 print "1..0 # Skip: no multitasking\n"; 15 exit 0; 16 } 17} 18 19use Config; 20$| = 1; 21$SIG{PIPE} = 'IGNORE'; 22 23print "1..10\n"; 24 25$perl = qq[$^X "-I../lib"]; 26 27# 28# commands run 4 perl programs. Two of these programs write a 29# short message to STDOUT and exit. Two of these programs 30# read from STDIN. One reader never exits and must be killed. 31# the other reader reads one line, waits a few seconds and then 32# exits to test the waitpid function. 33# 34$cmd1 = qq/$perl -e "\$|=1; print qq[first process\\n]; sleep 30;"/; 35$cmd2 = qq/$perl -e "\$|=1; print qq[second process\\n]; sleep 30;"/; 36$cmd3 = qq/$perl -e "print <>;"/; # hangs waiting for end of STDIN 37$cmd4 = qq/$perl -e "print scalar <>;"/; 38 39#warn "#$cmd1\n#$cmd2\n#$cmd3\n#$cmd4\n"; 40 41# start the processes 42$pid1 = open(FH1, "$cmd1 |") or print "not "; 43print "ok 1\n"; 44$pid2 = open(FH2, "$cmd2 |") or print "not "; 45print "ok 2\n"; 46$pid3 = open(FH3, "| $cmd3") or print "not "; 47print "ok 3\n"; 48$pid4 = open(FH4, "| $cmd4") or print "not "; 49print "ok 4\n"; 50 51print "# pids were $pid1, $pid2, $pid3, $pid4\n"; 52 53my $killsig = 'HUP'; 54$killsig = 1 unless $Config{sig_name} =~ /\bHUP\b/; 55 56# get message from first process and kill it 57chomp($from_pid1 = scalar(<FH1>)); 58print "# child1 returned [$from_pid1]\nnot " 59 unless $from_pid1 eq 'first process'; 60print "ok 5\n"; 61$kill_cnt = kill $killsig, $pid1; 62print "not " unless $kill_cnt == 1; 63print "ok 6\n"; 64 65# get message from second process and kill second process and reader process 66chomp($from_pid2 = scalar(<FH2>)); 67print "# child2 returned [$from_pid2]\nnot " 68 unless $from_pid2 eq 'second process'; 69print "ok 7\n"; 70$kill_cnt = kill $killsig, $pid2, $pid3; 71print "not " unless $kill_cnt == 2; 72print "ok 8\n"; 73 74# send one expected line of text to child process and then wait for it 75select(FH4); $| = 1; select(STDOUT); 76 77print FH4 "ok 9\n"; 78print "# waiting for process $pid4 to exit\n"; 79$reap_pid = waitpid $pid4, 0; 80print "# reaped pid $reap_pid != $pid4\nnot " 81 unless $reap_pid == $pid4; 82print "ok 10\n"; 83