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