126 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			126 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* test 1 */
 | |
| 
 | |
| #include <sys/types.h>
 | |
| #include <sys/wait.h>
 | |
| #include <errno.h>
 | |
| #include <signal.h>
 | |
| #include <stdlib.h>
 | |
| #include <unistd.h>
 | |
| #include <stdio.h>
 | |
| 
 | |
| #define SIGNUM 10
 | |
| int max_error = 4;
 | |
| #include "common.h"
 | |
| 
 | |
| #define ITERATIONS 10
 | |
| 
 | |
| volatile int glov, gct;
 | |
| int subtest;
 | |
| 
 | |
| int main(int argc, char *argv []);
 | |
| void test1a(void);
 | |
| void parent(void);
 | |
| void child(int i);
 | |
| void test1b(void);
 | |
| void parent1(int childpid);
 | |
| void func(int s);
 | |
| void child1(void);
 | |
| 
 | |
| int main(argc, argv)
 | |
| int argc;
 | |
| char *argv[];
 | |
| {
 | |
|   int i, m = 0xFFFF;
 | |
| 
 | |
|   start(1);
 | |
| 
 | |
|   if (argc == 2) m = atoi(argv[1]);
 | |
| 
 | |
|   for (i = 0; i < ITERATIONS; i++) {
 | |
| 	if (m & 00001) test1a();
 | |
| 	if (m & 00002) test1b();
 | |
|   }
 | |
| 
 | |
|   quit();
 | |
|   return(-1);			/* impossible */
 | |
| }
 | |
| 
 | |
| void test1a()
 | |
| {
 | |
|   int i, n, pid;
 | |
| 
 | |
|   subtest = 1;
 | |
|   n = 4;
 | |
|   for (i = 0; i < n; i++) {
 | |
| 	if ((pid = fork())) {
 | |
| 		if (pid < 0) {
 | |
| 			printf("\nTest 1 fork failed\n");
 | |
| 			exit(1);
 | |
| 		}
 | |
| 		parent();
 | |
| 	} else
 | |
| 		child(i);
 | |
|   }
 | |
| }
 | |
| 
 | |
| void parent()
 | |
| {
 | |
| 
 | |
|   int n;
 | |
| 
 | |
|   n = getpid();
 | |
|   wait(&n);
 | |
| }
 | |
| 
 | |
| void child(i)
 | |
| int i;
 | |
| {
 | |
|   (void) getpid();
 | |
|   exit(100+i);
 | |
| }
 | |
| 
 | |
| void test1b()
 | |
| {
 | |
|   int i, k;
 | |
| 
 | |
|   subtest = 2;
 | |
|   for (i = 0; i < 4; i++) {
 | |
| 	glov = 0;
 | |
| 	signal(SIGNUM, func);
 | |
| 	if ((k = fork())) {
 | |
| 		if (k < 0) {
 | |
| 			printf("Test 1 fork failed\n");
 | |
| 			exit(1);
 | |
| 		}
 | |
| 		parent1(k);
 | |
| 	} else
 | |
| 		child1();
 | |
|   }
 | |
| }
 | |
| 
 | |
| void parent1(childpid)
 | |
| int childpid;
 | |
| {
 | |
| 
 | |
|   int n;
 | |
| 
 | |
|   for (n = 0; n < 5000; n++);
 | |
|   while (kill(childpid, SIGNUM) < 0)	/* null statement */
 | |
| 	;
 | |
|   wait(&n);
 | |
| }
 | |
| 
 | |
| void func(s)
 | |
| int s;				/* for ANSI */
 | |
| {
 | |
|   glov++;
 | |
|   gct++;
 | |
| }
 | |
| 
 | |
| void child1()
 | |
| {
 | |
|   while (glov == 0);
 | |
|   exit(gct);
 | |
| }
 | |
| 
 | 
