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