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