diff --git a/lib/test_process.c b/lib/test_process.c index 6a4776c5..e20b270d 100644 --- a/lib/test_process.c +++ b/lib/test_process.c @@ -38,19 +38,37 @@ static void usage(void) void -signal_handler(int signum) +signal_handler(int signum, siginfo_t *siginfo, void *ucontext) { + char *signame = NULL; + switch(signum) { case SIGUSR1: - printf("SIG SIGUSR1\n"); + signame = strdup("SIGUSR1"); break; case SIGUSR2: - printf("SIG SIGUSR2\n"); + signame = strdup("SIGUSR2"); break; default: printf("SIG unknown\n"); exit(EXIT_FAILURE); } + if (signame == NULL) { + printf("SIG malloc error\n"); + exit(EXIT_FAILURE); + } + switch (siginfo->si_code) { + case SI_USER: + printf("SIG %s\n", signame); + break; + case SI_QUEUE: + printf("SIG %s value=%d\n", signame, siginfo->si_int); + break; + default: + printf("Unknown si_code %d\n", siginfo->si_code); + exit(EXIT_FAILURE); + } + } int main(int argc, char *argv[]) @@ -74,9 +92,9 @@ int main(int argc, char *argv[]) } /* Setup signal handling */ - signal_action.sa_handler = signal_handler; + signal_action.sa_sigaction = signal_handler; sigemptyset (&signal_action.sa_mask); - signal_action.sa_flags = 0; + signal_action.sa_flags = SA_SIGINFO; sigaction(SIGUSR1, &signal_action, NULL); sigaction(SIGUSR2, &signal_action, NULL); diff --git a/testsuite/config/unix.exp b/testsuite/config/unix.exp index 61a329ed..4156c3b9 100644 --- a/testsuite/config/unix.exp +++ b/testsuite/config/unix.exp @@ -52,6 +52,17 @@ proc expect_pass { testname reg } { } } +proc expect_pipeproc_pass { testname reg } { + global pipeproc_spawnid + + expect { + -i $pipeproc_spawnid + -re "$reg" { pass "$testname" } + default { fail "$testname" } + timeout { fail "$testname (timeout)" } + } +} + proc expect_blank { testname } { expect { -re "\\w" { fail "$testname" } @@ -60,6 +71,14 @@ proc expect_blank { testname } { } } +proc expect_blank_continue { testname } { + expect { + -re "\\w" { fail "$testname" } + eof { } + timeout { pass "$testname (timeout)" } + } +} + proc expect_table { test match_header match_items match_footer } { expect { -re "$match_header" { @@ -117,6 +136,15 @@ proc expect_table_dsc { test match_header match_item } { #} } +proc make_pipeproc { } { + global pipeproc_pid pipeproc_spawnid topdir + + set testproc_realpath "${topdir}/lib/test_process" + + set pipeproc_pid [ spawn $testproc_realpath ] + set pipeproc_spawnid $spawn_id + +} proc make_testproc { } { global testproc_path testproc_comm testproc_arg_str testproc1_pid testproc2_pid topdir @@ -157,6 +185,11 @@ proc kill_testproc { } { file delete $testproc_path } +proc kill_pipeproc { } { + global pipeproc_pid + kill_process $pipeproc_pid +} + proc get_tty {} { if { [catch { set raw_tty [ exec tty ] } msg]} { warning "No TTY found" diff --git a/testsuite/kill.test/kill.exp b/testsuite/kill.test/kill.exp index 1948517f..2032e0e5 100644 --- a/testsuite/kill.test/kill.exp +++ b/testsuite/kill.test/kill.exp @@ -45,26 +45,21 @@ set test "kill convert signal number to name with space" spawn $kill -l 1 expect_pass "$test" "^HUP\\s*" -#set test "kill numbered process" -#make_testproc -#if { [ file isdirectory "/proc/$testproc1_pid" ] && [ file isdirectory "/proc/$testproc2_pid" ] } { -#} else { -# perror "Could not start test processes" -#} -#exec $kill -KILL $testproc1_pid -#wait -#if { [ file exists "/proc/$testproc1_pid" ] } { -# exec kill $testproc2_pid -# fail "$test (proc 1 exists)" -#} else { -# exec $kill -KILL $testproc2_pid -# wait -# if { [ file exists "/proc/$testproc2_pid" ] } { -# exec kill $testproc2_pid -# fail "$test (proc 2 exists)" -# } else { -# pass "$test" -# } -#} -## Cleanup -#exec rm $testproc_path +make_pipeproc + +set test "kill with SIGUSR1" +spawn $kill -USR1 $pipeproc_pid +expect_blank_continue "$test" +expect_pipeproc_pass "$test" "SIG SIGUSR1" + +set test "kill with long SIGUSR2" +spawn $kill -s SIGUSR2 $pipeproc_pid +expect_blank_continue "$test" +expect_pipeproc_pass "$test" "SIG SIGUSR2" + +set test "kill with queued int" +spawn $kill -USR1 -q 42 $pipeproc_pid +expect_blank_continue "$test" +expect_pipeproc_pass "$test" "SIG SIGUSR1 value=42" + +kill_pipeproc diff --git a/testsuite/pkill.test/pkill.exp b/testsuite/pkill.test/pkill.exp index 76e5c0cb..573df6eb 100644 --- a/testsuite/pkill.test/pkill.exp +++ b/testsuite/pkill.test/pkill.exp @@ -18,7 +18,6 @@ expect_pass "$test" "^\(lt-\)\?pkill: no matching criteria specified\\s*" make_testproc set testproc_len [ string length $testproc_comm ] set testproc_trim [ string range $testproc_comm 0 [ expr { $testproc_len - 2 } ] ] -set testproc1_sid [ exec $ps --no-headers -o sid $testproc1_pid ] set test "pkill find both test pids" spawn $pkill -0 -e $testproc_comm @@ -34,3 +33,19 @@ expect_pass "$test" "invalid option -- '0'" # Cleanup kill_testproc + +make_pipeproc + +set test "pkill with SIGUSR1" +spawn $pkill -USR1 -e $testproc_comm +expect_pipeproc_pass "$test" "SIG SIGUSR1" + +set test "pkill with SIGUSR2" +spawn $pkill -USR2 -e $testproc_comm +expect_pipeproc_pass "$test" "SIG SIGUSR2" + +set test "pkill with queued int" +spawn $pkill -USR1 -e -q 42 $testproc_comm +expect_pipeproc_pass "$test" "SIG SIGUSR1 value=42" + +kill_pipeproc