test1.c

Go to the documentation of this file.
00001 /* test 1 */
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);               /* have to flush for child's benefit */
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);                   /* impossible */
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)    /* null statement */
00118         ;
00119   wait(&n);
00120 }
00121 
00122 void func(s)
00123 int s;                          /* for ANSI */
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 }

Generated on Fri Apr 14 22:57:32 2006 for minix by  doxygen 1.4.6