kill06.c revision b8360ee9a4b3e0ae1707116f48bfdbcee9ba2dbe
1865695bbc89088b9526ea9045410e5afb70a985cplars/* 2865695bbc89088b9526ea9045410e5afb70a985cplars * 3865695bbc89088b9526ea9045410e5afb70a985cplars * Copyright (c) International Business Machines Corp., 2001 4865695bbc89088b9526ea9045410e5afb70a985cplars * 5865695bbc89088b9526ea9045410e5afb70a985cplars * This program is free software; you can redistribute it and/or modify 6865695bbc89088b9526ea9045410e5afb70a985cplars * it under the terms of the GNU General Public License as published by 7865695bbc89088b9526ea9045410e5afb70a985cplars * the Free Software Foundation; either version 2 of the License, or 8865695bbc89088b9526ea9045410e5afb70a985cplars * (at your option) any later version. 9865695bbc89088b9526ea9045410e5afb70a985cplars * 10865695bbc89088b9526ea9045410e5afb70a985cplars * This program is distributed in the hope that it will be useful, 11865695bbc89088b9526ea9045410e5afb70a985cplars * but WITHOUT ANY WARRANTY; without even the implied warranty of 12865695bbc89088b9526ea9045410e5afb70a985cplars * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 13865695bbc89088b9526ea9045410e5afb70a985cplars * the GNU General Public License for more details. 14865695bbc89088b9526ea9045410e5afb70a985cplars * 15865695bbc89088b9526ea9045410e5afb70a985cplars * You should have received a copy of the GNU General Public License 16865695bbc89088b9526ea9045410e5afb70a985cplars * along with this program; if not, write to the Free Software 17865695bbc89088b9526ea9045410e5afb70a985cplars * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 18865695bbc89088b9526ea9045410e5afb70a985cplars */ 19865695bbc89088b9526ea9045410e5afb70a985cplars 20865695bbc89088b9526ea9045410e5afb70a985cplars/* 21865695bbc89088b9526ea9045410e5afb70a985cplars * NAME 22865695bbc89088b9526ea9045410e5afb70a985cplars * kill06.c 23865695bbc89088b9526ea9045410e5afb70a985cplars * 24865695bbc89088b9526ea9045410e5afb70a985cplars * DESCRIPTION 25865695bbc89088b9526ea9045410e5afb70a985cplars * Test case to check the basic functionality of kill() when killing an 26865695bbc89088b9526ea9045410e5afb70a985cplars * entire process group with a negative pid. 27865695bbc89088b9526ea9045410e5afb70a985cplars * 28865695bbc89088b9526ea9045410e5afb70a985cplars * ALGORITHM 29865695bbc89088b9526ea9045410e5afb70a985cplars * call setup 30865695bbc89088b9526ea9045410e5afb70a985cplars * loop if the -i option was given 31865695bbc89088b9526ea9045410e5afb70a985cplars * fork 5 children 32865695bbc89088b9526ea9045410e5afb70a985cplars * execute the kill system call 33865695bbc89088b9526ea9045410e5afb70a985cplars * check the return value 34865695bbc89088b9526ea9045410e5afb70a985cplars * if return value is -1 35865695bbc89088b9526ea9045410e5afb70a985cplars * issue a FAIL message, break remaining tests and cleanup 36865695bbc89088b9526ea9045410e5afb70a985cplars * if we are doing functional testing 37865695bbc89088b9526ea9045410e5afb70a985cplars * if the processes were terminated with the expected signal. 38865695bbc89088b9526ea9045410e5afb70a985cplars * issue a PASS message 39865695bbc89088b9526ea9045410e5afb70a985cplars * otherwise 40865695bbc89088b9526ea9045410e5afb70a985cplars * issue a FAIL message 41865695bbc89088b9526ea9045410e5afb70a985cplars * call cleanup 42865695bbc89088b9526ea9045410e5afb70a985cplars * 43865695bbc89088b9526ea9045410e5afb70a985cplars * USAGE 44865695bbc89088b9526ea9045410e5afb70a985cplars * kill06 [-c n] [-f] [-i n] [-I x] [-P x] [-t] 45865695bbc89088b9526ea9045410e5afb70a985cplars * where, -c n : Run n copies concurrently. 46865695bbc89088b9526ea9045410e5afb70a985cplars * -f : Turn off functionality Testing. 47865695bbc89088b9526ea9045410e5afb70a985cplars * -i n : Execute test n times. 48865695bbc89088b9526ea9045410e5afb70a985cplars * -I x : Execute test for x seconds. 49865695bbc89088b9526ea9045410e5afb70a985cplars * -P x : Pause for x seconds between iterations. 50865695bbc89088b9526ea9045410e5afb70a985cplars * -t : Turn on syscall timing. 51865695bbc89088b9526ea9045410e5afb70a985cplars * 52865695bbc89088b9526ea9045410e5afb70a985cplars * HISTORY 53865695bbc89088b9526ea9045410e5afb70a985cplars * 07/2001 Ported by Wayne Boyer 54865695bbc89088b9526ea9045410e5afb70a985cplars * 55865695bbc89088b9526ea9045410e5afb70a985cplars * RESTRICTIONS 56865695bbc89088b9526ea9045410e5afb70a985cplars * This test should be run as a non-root user. 57865695bbc89088b9526ea9045410e5afb70a985cplars */ 58865695bbc89088b9526ea9045410e5afb70a985cplars 59865695bbc89088b9526ea9045410e5afb70a985cplars#include "test.h" 60865695bbc89088b9526ea9045410e5afb70a985cplars#include "usctest.h" 61865695bbc89088b9526ea9045410e5afb70a985cplars 62865695bbc89088b9526ea9045410e5afb70a985cplars#include <signal.h> 63865695bbc89088b9526ea9045410e5afb70a985cplars#include <errno.h> 64865695bbc89088b9526ea9045410e5afb70a985cplars#include <sys/wait.h> 65865695bbc89088b9526ea9045410e5afb70a985cplars 66865695bbc89088b9526ea9045410e5afb70a985cplarsvoid cleanup(void); 67865695bbc89088b9526ea9045410e5afb70a985cplarsvoid setup(void); 68865695bbc89088b9526ea9045410e5afb70a985cplars 69865695bbc89088b9526ea9045410e5afb70a985cplarschar *TCID= "kill06()"; 70865695bbc89088b9526ea9045410e5afb70a985cplarsint TST_TOTAL = 1; 71865695bbc89088b9526ea9045410e5afb70a985cplars 72865695bbc89088b9526ea9045410e5afb70a985cplarsextern int Tst_count; 73865695bbc89088b9526ea9045410e5afb70a985cplars 74865695bbc89088b9526ea9045410e5afb70a985cplars#define TEST_SIG SIGKILL 75865695bbc89088b9526ea9045410e5afb70a985cplars 76b8360ee9a4b3e0ae1707116f48bfdbcee9ba2dberobbiewint main(int ac, char **av) 77865695bbc89088b9526ea9045410e5afb70a985cplars{ 78865695bbc89088b9526ea9045410e5afb70a985cplars int lc; /* loop counter */ 79865695bbc89088b9526ea9045410e5afb70a985cplars char *msg; /* message returned from parse_opts */ 80865695bbc89088b9526ea9045410e5afb70a985cplars pid_t pid1, pid2; 81865695bbc89088b9526ea9045410e5afb70a985cplars int exno, status, nsig, i; 82865695bbc89088b9526ea9045410e5afb70a985cplars 83865695bbc89088b9526ea9045410e5afb70a985cplars /* parse standard options */ 84865695bbc89088b9526ea9045410e5afb70a985cplars if ((msg = parse_opts(ac, av, (option_t *)NULL, NULL)) != (char *)NULL){ 85865695bbc89088b9526ea9045410e5afb70a985cplars tst_brkm(TBROK, cleanup, "OPTION PARSING ERROR - %s", msg); 86865695bbc89088b9526ea9045410e5afb70a985cplars } 87865695bbc89088b9526ea9045410e5afb70a985cplars 88865695bbc89088b9526ea9045410e5afb70a985cplars setup(); /* global setup */ 89865695bbc89088b9526ea9045410e5afb70a985cplars 90865695bbc89088b9526ea9045410e5afb70a985cplars /* The following loop checks looping state if -i option given */ 91865695bbc89088b9526ea9045410e5afb70a985cplars for (lc = 0; TEST_LOOPING(lc); lc++) { 92865695bbc89088b9526ea9045410e5afb70a985cplars 93865695bbc89088b9526ea9045410e5afb70a985cplars /* reset Tst_count in case we are looping */ 94865695bbc89088b9526ea9045410e5afb70a985cplars Tst_count = 0; 95865695bbc89088b9526ea9045410e5afb70a985cplars status = 1; 96865695bbc89088b9526ea9045410e5afb70a985cplars exno = 1; 97865695bbc89088b9526ea9045410e5afb70a985cplars 98865695bbc89088b9526ea9045410e5afb70a985cplars /* Fork a process and set the process group so that */ 99865695bbc89088b9526ea9045410e5afb70a985cplars /* it is different from this one. Fork 5 more children. */ 100865695bbc89088b9526ea9045410e5afb70a985cplars 101865695bbc89088b9526ea9045410e5afb70a985cplars pid1 = fork(); 102865695bbc89088b9526ea9045410e5afb70a985cplars if (pid1 < 0) { 103865695bbc89088b9526ea9045410e5afb70a985cplars tst_brkm(TBROK, cleanup, "Fork of first child failed"); 104865695bbc89088b9526ea9045410e5afb70a985cplars } else if (pid1 == 0) { 105865695bbc89088b9526ea9045410e5afb70a985cplars setpgrp(); 106865695bbc89088b9526ea9045410e5afb70a985cplars for (i = 0; i < 5; i++) { 107865695bbc89088b9526ea9045410e5afb70a985cplars pid2 = fork(); 108865695bbc89088b9526ea9045410e5afb70a985cplars if (pid2 < 0) { 109865695bbc89088b9526ea9045410e5afb70a985cplars tst_brkm(TBROK, cleanup, "Fork failed"); 110865695bbc89088b9526ea9045410e5afb70a985cplars } else if (pid2 == 0) { 111865695bbc89088b9526ea9045410e5afb70a985cplars sleep(299); 112865695bbc89088b9526ea9045410e5afb70a985cplars /*NOTREACHED*/ 113865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TINFO, "%d never recieved a" 114865695bbc89088b9526ea9045410e5afb70a985cplars " signal", getpid()); 115865695bbc89088b9526ea9045410e5afb70a985cplars exit(exno); 116865695bbc89088b9526ea9045410e5afb70a985cplars } 117865695bbc89088b9526ea9045410e5afb70a985cplars } 118865695bbc89088b9526ea9045410e5afb70a985cplars /* Kill all processes in this process group */ 119865695bbc89088b9526ea9045410e5afb70a985cplars TEST(kill(-pid1, TEST_SIG)); 120865695bbc89088b9526ea9045410e5afb70a985cplars sleep(300); 121865695bbc89088b9526ea9045410e5afb70a985cplars /*NOTREACHED*/ 122865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TINFO, "%d never recieved a" 123865695bbc89088b9526ea9045410e5afb70a985cplars " signal", getpid()); 124865695bbc89088b9526ea9045410e5afb70a985cplars exit(exno); 125865695bbc89088b9526ea9045410e5afb70a985cplars } else { 126865695bbc89088b9526ea9045410e5afb70a985cplars waitpid(pid1, &status, 0); 127865695bbc89088b9526ea9045410e5afb70a985cplars if (TEST_RETURN != 0) { 128865695bbc89088b9526ea9045410e5afb70a985cplars tst_brkm(TFAIL, cleanup, "%s failed - errno = " 129865695bbc89088b9526ea9045410e5afb70a985cplars "%d : %s", TCID, TEST_ERRNO, 130865695bbc89088b9526ea9045410e5afb70a985cplars strerror(TEST_ERRNO)); 131865695bbc89088b9526ea9045410e5afb70a985cplars } 132865695bbc89088b9526ea9045410e5afb70a985cplars } 133865695bbc89088b9526ea9045410e5afb70a985cplars 134865695bbc89088b9526ea9045410e5afb70a985cplars if (STD_FUNCTIONAL_TEST) { 135865695bbc89088b9526ea9045410e5afb70a985cplars /* 136865695bbc89088b9526ea9045410e5afb70a985cplars * Check to see if the process was terminated with the 137865695bbc89088b9526ea9045410e5afb70a985cplars * expected signal. 138865695bbc89088b9526ea9045410e5afb70a985cplars */ 139865695bbc89088b9526ea9045410e5afb70a985cplars nsig = WTERMSIG(status); 140865695bbc89088b9526ea9045410e5afb70a985cplars if (! nsig) { 141865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "Did not receive any signal"); 142865695bbc89088b9526ea9045410e5afb70a985cplars } else if (nsig == TEST_SIG) { 143865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TPASS, "received expected signal %d", 144865695bbc89088b9526ea9045410e5afb70a985cplars nsig); 145865695bbc89088b9526ea9045410e5afb70a985cplars } else { 146865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "expected signal %d received %d" 147865695bbc89088b9526ea9045410e5afb70a985cplars ,TEST_SIG,nsig); 148865695bbc89088b9526ea9045410e5afb70a985cplars } 149865695bbc89088b9526ea9045410e5afb70a985cplars } 150865695bbc89088b9526ea9045410e5afb70a985cplars } 151865695bbc89088b9526ea9045410e5afb70a985cplars cleanup(); 152865695bbc89088b9526ea9045410e5afb70a985cplars 153865695bbc89088b9526ea9045410e5afb70a985cplars /*NOTREACHED*/ 154b8360ee9a4b3e0ae1707116f48bfdbcee9ba2dberobbiew return(0); 155865695bbc89088b9526ea9045410e5afb70a985cplars} 156865695bbc89088b9526ea9045410e5afb70a985cplars 157865695bbc89088b9526ea9045410e5afb70a985cplars 158865695bbc89088b9526ea9045410e5afb70a985cplars/* 159865695bbc89088b9526ea9045410e5afb70a985cplars * setup() - performs all ONE TIME setup for this test 160865695bbc89088b9526ea9045410e5afb70a985cplars */ 161865695bbc89088b9526ea9045410e5afb70a985cplarsvoid 162865695bbc89088b9526ea9045410e5afb70a985cplarssetup(void) 163865695bbc89088b9526ea9045410e5afb70a985cplars{ 164865695bbc89088b9526ea9045410e5afb70a985cplars /* Setup default signal handling */ 165865695bbc89088b9526ea9045410e5afb70a985cplars tst_sig(FORK, DEF_HANDLER, cleanup); 166865695bbc89088b9526ea9045410e5afb70a985cplars 167865695bbc89088b9526ea9045410e5afb70a985cplars /* Pause if that option was specified */ 168865695bbc89088b9526ea9045410e5afb70a985cplars TEST_PAUSE; 169865695bbc89088b9526ea9045410e5afb70a985cplars} 170865695bbc89088b9526ea9045410e5afb70a985cplars 171865695bbc89088b9526ea9045410e5afb70a985cplars/* 172865695bbc89088b9526ea9045410e5afb70a985cplars * cleanup() - performs all the ONE TIME cleanup for this test at completion 173865695bbc89088b9526ea9045410e5afb70a985cplars * or premature exit. 174865695bbc89088b9526ea9045410e5afb70a985cplars */ 175865695bbc89088b9526ea9045410e5afb70a985cplarsvoid 176865695bbc89088b9526ea9045410e5afb70a985cplarscleanup(void) 177865695bbc89088b9526ea9045410e5afb70a985cplars{ 178865695bbc89088b9526ea9045410e5afb70a985cplars /* 179865695bbc89088b9526ea9045410e5afb70a985cplars * print timing status if that option was specified. 180865695bbc89088b9526ea9045410e5afb70a985cplars * print errno log if that option was specified 181865695bbc89088b9526ea9045410e5afb70a985cplars */ 182865695bbc89088b9526ea9045410e5afb70a985cplars TEST_CLEANUP; 183865695bbc89088b9526ea9045410e5afb70a985cplars 184865695bbc89088b9526ea9045410e5afb70a985cplars /* exit with return code appropriate for results */ 185865695bbc89088b9526ea9045410e5afb70a985cplars tst_exit(); 186865695bbc89088b9526ea9045410e5afb70a985cplars} 187