1 /* 2 * Copyright (c) International Business Machines Corp., 2001 3 * 07/2001 John George - Ported 4 * 04/2002 wjhuie sigset cleanups 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation; either version 2 of the License, or 9 * (at your option) any later version. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 14 * the GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with this program. 18 */ 19 20 /* 21 * Tests to see if pids returned from fork and waitpid are same 22 * 23 * Fork 8 kids, 2 will immediately exit, 2 will sleep, 2 will be compute bound 24 * and 2 will fork/reap a child for 50 times. 25 */ 26 27 #include "waitpid_common.h" 28 29 static void do_compute(void); 30 static void do_fork(void); 31 static void do_sleep(void); 32 33 static void do_child_1(void) 34 { 35 pid_t pid; 36 int i; 37 38 for (i = 0; i < MAXKIDS; i++) { 39 pid = SAFE_FORK(); 40 if (pid == 0) { 41 if (i == 0 || i == 1) 42 do_exit(0); 43 44 if (i == 2 || i == 3) 45 do_compute(); 46 47 if (i == 4 || i == 5) 48 do_fork(); 49 50 if (i == 6 || i == 7) 51 do_sleep(); 52 } 53 54 fork_kid_pid[i] = pid; 55 } 56 57 TST_CHECKPOINT_WAKE2(0, MAXKIDS); 58 59 if (TST_TRACE(reap_children(0, 0, fork_kid_pid, MAXKIDS))) 60 return; 61 62 tst_res(TPASS, "Test PASSED"); 63 } 64 65 static void do_compute(void) 66 { 67 int i; 68 69 TST_CHECKPOINT_WAIT(0); 70 71 for (i = 0; i < 100000; i++) ; 72 for (i = 0; i < 100000; i++) ; 73 for (i = 0; i < 100000; i++) ; 74 for (i = 0; i < 100000; i++) ; 75 for (i = 0; i < 100000; i++) ; 76 for (i = 0; i < 100000; i++) ; 77 for (i = 0; i < 100000; i++) ; 78 for (i = 0; i < 100000; i++) ; 79 for (i = 0; i < 100000; i++) ; 80 for (i = 0; i < 100000; i++) ; 81 82 exit(3); 83 } 84 85 static void do_fork(void) 86 { 87 pid_t fork_pid; 88 int i; 89 90 TST_CHECKPOINT_WAIT(0); 91 92 for (i = 0; i < 50; i++) { 93 fork_pid = SAFE_FORK(); 94 if (fork_pid == 0) 95 exit(3); 96 97 if (TST_TRACE(reap_children(fork_pid, 0, &fork_pid, 1))) 98 break; 99 } 100 101 exit(3); 102 } 103 104 static void do_sleep(void) 105 { 106 TST_CHECKPOINT_WAIT(0); 107 108 sleep(1); 109 sleep(1); 110 111 exit(3); 112 } 113 114 static struct tst_test test = { 115 .forks_child = 1, 116 .needs_checkpoints = 1, 117 .setup = waitpid_setup, 118 .cleanup = waitpid_cleanup, 119 .test_all = waitpid_test, 120 }; 121