1/* 2 * 3 * Copyright (c) International Business Machines Corp., 2001 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation; either version 2 of the License, or 8 * (at your option) any later version. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 13 * the GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program; if not, write to the Free Software 17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 18 */ 19 20/* 21 * NAME 22 * kill08.c 23 * 24 * DESCRIPTION 25 * Test case to check the basic functionality of kill() when kill an 26 * entire process group. 27 * 28 * ALGORITHM 29 * call setup 30 * loop if the -i option was given 31 * fork 5 childeren 32 * execute the kill system call 33 * check the return value 34 * if return value is -1 35 * issue a FAIL message, break remaining tests and cleanup 36 * if we are doing functional testing 37 * if the processes were terminated with the expected signal. 38 * issue a PASS message 39 * otherwise 40 * issue a FAIL message 41 * call cleanup 42 * 43 * USAGE 44 * kill08 [-c n] [-f] [-i n] [-I x] [-P x] [-t] 45 * where, -c n : Run n copies concurrently. 46 * -f : Turn off functionality Testing. 47 * -i n : Execute test n times. 48 * -I x : Execute test for x seconds. 49 * -P x : Pause for x seconds between iterations. 50 * -t : Turn on syscall timing. 51 * 52 * HISTORY 53 * 07/2001 Ported by Wayne Boyer 54 * 55 * RESTRICTIONS 56 * This test should be run as a non-root user. 57 */ 58 59#include "test.h" 60 61#include <signal.h> 62#include <errno.h> 63#include <sys/wait.h> 64 65void cleanup(void); 66void setup(void); 67void do_child(void); 68 69char *TCID = "kill08"; 70int TST_TOTAL = 1; 71 72#define TEST_SIG SIGKILL 73 74int main(int ac, char **av) 75{ 76 int lc; 77 pid_t pid1, pid2; 78 int exno, status, nsig, i; 79 80 tst_parse_opts(ac, av, NULL, NULL); 81#ifdef UCLINUX 82 maybe_run_child(&do_child, ""); 83#endif 84 85 setup(); /* global setup */ 86 87 /* The following loop checks looping state if -i option given */ 88 for (lc = 0; TEST_LOOPING(lc); lc++) { 89 90 /* reset tst_count in case we are looping */ 91 tst_count = 0; 92 status = 1; 93 exno = 1; 94 95 /* Fork a process and set the process group so that */ 96 /* it is different from this one. Fork 5 more children. */ 97 98 pid1 = FORK_OR_VFORK(); 99 if (pid1 < 0) { 100 tst_brkm(TBROK, cleanup, "Fork of first child failed"); 101 } else if (pid1 == 0) { 102 setpgrp(); 103 for (i = 0; i < 5; i++) { 104 pid2 = FORK_OR_VFORK(); 105 if (pid2 < 0) { 106 tst_brkm(TBROK, cleanup, "Fork failed"); 107 } else if (pid2 == 0) { 108#ifdef UCLINUX 109 if (self_exec(av[0], "") < 0) { 110 tst_brkm(TBROK, cleanup, 111 "self_exec of " 112 "child failed"); 113 } 114#else 115 do_child(); 116#endif 117 } 118 } 119 /* Kill all processes in this process group */ 120 TEST(kill(0, TEST_SIG)); 121 pause(); 122 exit(exno); 123 } else { 124 waitpid(pid1, &status, 0); 125 if (TEST_RETURN != 0) { 126 tst_brkm(TFAIL, cleanup, "%s failed - errno = " 127 "%d : %s", TCID, TEST_ERRNO, 128 strerror(TEST_ERRNO)); 129 } 130 } 131 132 /* 133 * Check to see if the process was terminated with the 134 * expected signal. 135 */ 136 nsig = WTERMSIG(status); 137 if (nsig == TEST_SIG) { 138 tst_resm(TPASS, "received expected signal %d", 139 nsig); 140 } else { 141 tst_resm(TFAIL, 142 "expected signal %d received %d", 143 TEST_SIG, nsig); 144 } 145 } 146 147 cleanup(); 148 tst_exit(); 149} 150 151/* 152 * do_child() 153 */ 154void do_child(void) 155{ 156 int exno = 1; 157 158 pause(); 159 exit(exno); 160} 161 162/* 163 * setup() - performs all ONE TIME setup for this test 164 */ 165void setup(void) 166{ 167 168 TEST_PAUSE; 169} 170 171/* 172 * cleanup() - performs all the ONE TIME cleanup for this test at completion 173 * or premature exit. 174 */ 175void cleanup(void) 176{ 177 178} 179