1 /*
2  *   Copyright (c) International Business Machines  Corp., 2001
3  *
4  *   This program is free software;  you can redistribute it and/or modify
5  *   it under the terms of the GNU General Public License as published by
6  *   the Free Software Foundation; either version 2 of the License, or
7  *   (at your option) any later version.
8  *
9  *   This program is distributed in the hope that it will be useful,
10  *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
11  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
12  *   the GNU General Public License for more details.
13  *
14  *   You should have received a copy of the GNU General Public License
15  *   along with this program;  if not, write to the Free Software
16  *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17  *
18  * NAME
19  *	fork06.c
20  *
21  * DESCRIPTION
22  *	Test that a process can fork children a large number of
23  *	times in succession
24  *
25  * ALGORITHM
26  *	Attempt to fork a child that exits immediately
27  *	Repeat it many times(1000), counting the number of successes and
28  *	failures
29  *
30  * USAGE
31  *	fork06
32  *
33  * HISTORY
34  *	07/2001 Ported by Wayne Boyer
35  *
36  * RESTRICTIONS
37  *	None
38  */
39 
40 #include <sys/types.h>
41 #include <sys/wait.h>
42 #include <stdio.h>
43 #include "test.h"
44 
45 char *TCID = "fork06";
46 int TST_TOTAL = 1;
47 
48 static void setup(void);
49 static void cleanup(void);
50 
51 #define NUMFORKS 1000
52 
main(int ac,char ** av)53 int main(int ac, char **av)
54 {
55 	int i, pid, status, childpid, succeed, fail;
56 
57 	int lc;
58 
59 	tst_parse_opts(ac, av, NULL, NULL);
60 
61 	setup();
62 
63 	for (lc = 0; TEST_LOOPING(lc); lc++) {
64 		tst_count = 0;
65 		succeed = 0;
66 		fail = 0;
67 
68 		for (i = 0; i < NUMFORKS; i++) {
69 			pid = fork();
70 			if (pid == -1) {
71 				fail++;
72 				continue;
73 			}
74 
75 			if (pid == 0)
76 				_exit(0);
77 
78 			childpid = wait(&status);
79 			if (pid != childpid)
80 				tst_resm(TFAIL, "pid from wait %d", childpid);
81 			succeed++;
82 		}
83 
84 		tst_resm(TINFO, "tries %d", i);
85 		tst_resm(TINFO, "successes %d", succeed);
86 		tst_resm(TINFO, "failures %d", fail);
87 
88 		if ((wait(&status)) == -1)
89 			tst_resm(TINFO, "There were no children to wait for");
90 		else
91 			tst_resm(TINFO, "There were children left");
92 	}
93 
94 	cleanup();
95 	tst_exit();
96 }
97 
setup(void)98 static void setup(void)
99 {
100 	tst_sig(FORK, DEF_HANDLER, cleanup);
101 	TEST_PAUSE;
102 }
103 
cleanup(void)104 static void cleanup(void)
105 {
106 }
107