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 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 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 66 void parent() 67 { 68 69 int n; 70 71 n = getpid(); 72 wait(&n); 73 } 74 75 void child(i) 76 int i; 77 { 78 (void) getpid(); 79 exit(100+i); 80 } 81 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 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 113 void func(s) 114 int s; /* for ANSI */ 115 { 116 glov++; 117 gct++; 118 } 119 120 void child1() 121 { 122 while (glov == 0); 123 exit(gct); 124 } 125 126