00001
00002
00003 #include <sys/types.h>
00004 #include <sys/wait.h>
00005 #include <errno.h>
00006 #include <signal.h>
00007 #include <stdlib.h>
00008 #include <unistd.h>
00009 #include <stdio.h>
00010
00011 #define SIGNUM 10
00012 #define MAX_ERROR 4
00013 #define ITERATIONS 10
00014
00015 _VOLATILE int glov, gct;
00016 int errct;
00017 int subtest;
00018
00019 _PROTOTYPE(int main, (int argc, char *argv []));
00020 _PROTOTYPE(void test1a, (void));
00021 _PROTOTYPE(void parent, (void));
00022 _PROTOTYPE(void child, (int i));
00023 _PROTOTYPE(void test1b, (void));
00024 _PROTOTYPE(void parent1, (int childpid));
00025 _PROTOTYPE(void func, (int s));
00026 _PROTOTYPE(void child1, (void));
00027 _PROTOTYPE(void e, (int n));
00028 _PROTOTYPE(void quit, (void));
00029
00030 int main(argc, argv)
00031 int argc;
00032 char *argv[];
00033 {
00034 int i, m = 0xFFFF;
00035
00036 sync();
00037
00038 if (argc == 2) m = atoi(argv[1]);
00039
00040 printf("Test 1 ");
00041 fflush(stdout);
00042
00043 system("rm -rf DIR_01; mkdir DIR_01");
00044 chdir("DIR_01");
00045
00046 for (i = 0; i < ITERATIONS; i++) {
00047 if (m & 00001) test1a();
00048 if (m & 00002) test1b();
00049 }
00050
00051 quit();
00052 return(-1);
00053 }
00054
00055 void test1a()
00056 {
00057 int i, n, pid;
00058
00059 subtest = 1;
00060 n = 4;
00061 for (i = 0; i < n; i++) {
00062 if ((pid = fork())) {
00063 if (pid < 0) {
00064 printf("\nTest 1 fork failed\n");
00065 exit(1);
00066 }
00067 parent();
00068 } else
00069 child(i);
00070 }
00071 }
00072
00073 void parent()
00074 {
00075
00076 int n;
00077
00078 n = getpid();
00079 wait(&n);
00080 }
00081
00082 void child(i)
00083 int i;
00084 {
00085 int n;
00086
00087 n = getpid();
00088 exit(100+i);
00089 }
00090
00091 void test1b()
00092 {
00093 int i, k;
00094
00095 subtest = 2;
00096 for (i = 0; i < 4; i++) {
00097 glov = 0;
00098 signal(SIGNUM, func);
00099 if ((k = fork())) {
00100 if (k < 0) {
00101 printf("Test 1 fork failed\n");
00102 exit(1);
00103 }
00104 parent1(k);
00105 } else
00106 child1();
00107 }
00108 }
00109
00110 void parent1(childpid)
00111 int childpid;
00112 {
00113
00114 int n;
00115
00116 for (n = 0; n < 5000; n++);
00117 while (kill(childpid, SIGNUM) < 0)
00118 ;
00119 wait(&n);
00120 }
00121
00122 void func(s)
00123 int s;
00124 {
00125 glov++;
00126 gct++;
00127 }
00128
00129 void child1()
00130 {
00131 while (glov == 0);
00132 exit(gct);
00133 }
00134
00135 void quit()
00136 {
00137
00138 chdir("..");
00139 system("rm -rf DIR*");
00140
00141 if (errct == 0) {
00142 printf("ok\n");
00143 exit(0);
00144 } else {
00145 printf("%d errors\n", errct);
00146 exit(1);
00147 }
00148 }