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