xref: /minix3/minix/tests/test1.c (revision 433d6423c39e34ec4b79c950597bb2d236f886be)
1 /* test 1 */
2 
3 #include <sys/types.h>
4 #include <sys/wait.h>
5 #include <errno.h>
6 #include <signal.h>
7 #include <stdlib.h>
8 #include <unistd.h>
9 #include <stdio.h>
10 
11 #define SIGNUM 10
12 int max_error = 4;
13 #include "common.h"
14 
15 #define ITERATIONS 10
16 
17 volatile int glov, gct;
18 int subtest;
19 
20 int main(int argc, char *argv []);
21 void test1a(void);
22 void parent(void);
23 void child(int i);
24 void test1b(void);
25 void parent1(int childpid);
26 void func(int s);
27 void child1(void);
28 
main(argc,argv)29 int main(argc, argv)
30 int argc;
31 char *argv[];
32 {
33   int i, m = 0xFFFF;
34 
35   start(1);
36 
37   if (argc == 2) m = atoi(argv[1]);
38 
39   for (i = 0; i < ITERATIONS; i++) {
40 	if (m & 00001) test1a();
41 	if (m & 00002) test1b();
42   }
43 
44   quit();
45   return(-1);			/* impossible */
46 }
47 
test1a()48 void test1a()
49 {
50   int i, n, pid;
51 
52   subtest = 1;
53   n = 4;
54   for (i = 0; i < n; i++) {
55 	if ((pid = fork())) {
56 		if (pid < 0) {
57 			printf("\nTest 1 fork failed\n");
58 			exit(1);
59 		}
60 		parent();
61 	} else
62 		child(i);
63   }
64 }
65 
parent()66 void parent()
67 {
68 
69   int n;
70 
71   n = getpid();
72   wait(&n);
73 }
74 
child(i)75 void child(i)
76 int i;
77 {
78   (void) getpid();
79   exit(100+i);
80 }
81 
test1b()82 void test1b()
83 {
84   int i, k;
85 
86   subtest = 2;
87   for (i = 0; i < 4; i++) {
88 	glov = 0;
89 	signal(SIGNUM, func);
90 	if ((k = fork())) {
91 		if (k < 0) {
92 			printf("Test 1 fork failed\n");
93 			exit(1);
94 		}
95 		parent1(k);
96 	} else
97 		child1();
98   }
99 }
100 
parent1(childpid)101 void parent1(childpid)
102 int childpid;
103 {
104 
105   int n;
106 
107   for (n = 0; n < 5000; n++);
108   while (kill(childpid, SIGNUM) < 0)	/* null statement */
109 	;
110   wait(&n);
111 }
112 
func(s)113 void func(s)
114 int s;				/* for ANSI */
115 {
116   glov++;
117   gct++;
118 }
119 
child1()120 void child1()
121 {
122   while (glov == 0);
123   exit(gct);
124 }
125 
126