kill08.c revision 161b01e69dd6b5431cc05e90bc47269dbed86860
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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 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#include "usctest.h" 61 62#include <signal.h> 63#include <errno.h> 64#include <sys/wait.h> 65 66void cleanup(void); 67void setup(void); 68void do_child(void); 69 70char *TCID= "kill08"; 71int TST_TOTAL = 1; 72 73extern int Tst_count; 74 75#define TEST_SIG SIGKILL 76 77int main(int ac, char **av) 78{ 79 int lc; /* loop counter */ 80 char *msg; /* message returned from parse_opts */ 81 pid_t pid1, pid2; 82 int exno, status, nsig, i; 83 84 /* parse standard options */ 85 if ((msg = parse_opts(ac, av, (option_t *)NULL, NULL)) != (char *)NULL){ 86 tst_brkm(TBROK, cleanup, "OPTION PARSING ERROR - %s", msg); 87 } 88 89#ifdef UCLINUX 90 maybe_run_child(&do_child, ""); 91#endif 92 93 setup(); /* global setup */ 94 95 /* The following loop checks looping state if -i option given */ 96 for (lc = 0; TEST_LOOPING(lc); lc++) { 97 98 /* reset Tst_count in case we are looping */ 99 Tst_count = 0; 100 status = 1; 101 exno = 1; 102 103 /* Fork a process and set the process group so that */ 104 /* it is different from this one. Fork 5 more children. */ 105 106 pid1 = FORK_OR_VFORK(); 107 if (pid1 < 0) { 108 tst_brkm(TBROK, cleanup, "Fork of first child failed"); 109 } else if (pid1 == 0) { 110 setpgrp(); 111 for (i = 0; i < 5; i++) { 112 pid2 = FORK_OR_VFORK(); 113 if (pid2 < 0) { 114 tst_brkm(TBROK, cleanup, "Fork failed"); 115 } else if (pid2 == 0) { 116#ifdef UCLINUX 117 if (self_exec(av[0], "") < 0) { 118 tst_brkm(TBROK, cleanup, 119 "self_exec of " 120 "child failed"); 121 } 122#else 123 do_child(); 124#endif 125 } 126 } 127 /* Kill all processes in this process group */ 128 TEST(kill(0, TEST_SIG)); 129 pause(); 130 /*NOTREACHED*/ 131 exit(exno); 132 } else { 133 waitpid(pid1, &status, 0); 134 if (TEST_RETURN != 0) { 135 tst_brkm(TFAIL, cleanup, "%s failed - errno = " 136 "%d : %s", TCID, TEST_ERRNO, 137 strerror(TEST_ERRNO)); 138 } 139 } 140 141 if (STD_FUNCTIONAL_TEST) { 142 /* 143 * Check to see if the process was terminated with the 144 * expected signal. 145 */ 146 nsig = WTERMSIG(status); 147 if (nsig == TEST_SIG) { 148 tst_resm(TPASS, "received expected signal %d", 149 nsig); 150 } else { 151 tst_resm(TFAIL, "expected signal %d received %d" 152 ,TEST_SIG,nsig); 153 } 154 } else { 155 tst_resm(TPASS, "call succeeded"); 156 } 157 } 158 cleanup(); 159 160 /*NOTREACHED*/ 161 return(0); 162} 163 164/* 165 * do_child() 166 */ 167void 168do_child() 169{ 170 int exno = 1; 171 172 pause(); 173 /*NOTREACHED*/ 174 exit(exno); 175} 176 177/* 178 * setup() - performs all ONE TIME setup for this test 179 */ 180void 181setup(void) 182{ 183 /* Pause if that option was specified */ 184 TEST_PAUSE; 185} 186 187/* 188 * cleanup() - performs all the ONE TIME cleanup for this test at completion 189 * or premature exit. 190 */ 191void 192cleanup(void) 193{ 194 /* 195 * print timing status if that option was specified. 196 * print errno log if that option was specified 197 */ 198 TEST_CLEANUP; 199 200 /* exit with return code appropriate for results */ 201 tst_exit(); 202} 203