home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Professional / OS2PRO194.ISO / os2 / prgramer / unix / emx / test / fork.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-12-29  |  3.6 KB  |  161 lines

  1. /* fork.c (emx+gcc) */
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <process.h>
  7. #include <getopt.h>
  8. #include <signal.h>
  9. #include <time.h>
  10.  
  11. static int v = 1;
  12.  
  13.  
  14. static void usage (void)
  15. {
  16.   puts ("Usage: fork [-r#] [-z#] [-cnqsvw]");
  17.   puts ("Options:");
  18.   puts ("  -r#  Set number of recursion levels");
  19.   puts ("  -z#  Sleep for # seconds before forking");
  20.   puts ("  -c   Display clock() value");
  21.   puts ("  -n   Don't use heap");
  22.   puts ("  -q   Be quiet");
  23.   puts ("  -s   Set SIGCLD handler");
  24.   puts ("  -v   Be verbose");
  25.   puts ("  -w   Wait for children");
  26.   exit (1);
  27. }
  28.  
  29.  
  30. static void handler (int sig)
  31. {
  32.   switch (sig)
  33.     {
  34.     case SIGCLD:
  35.       printf ("SIGCLD\n");
  36.       break;
  37.     default:
  38.       printf ("Signal %d\n", sig);
  39.       break;
  40.     }
  41.   fflush (stdout);
  42.   signal (SIGCLD, SIG_ACK);
  43. }
  44.  
  45.  
  46. int main (int argc, char *argv[])
  47. {
  48.   int c, i, n, p, t, v0, rep, opt_c, opt_n, opt_s, opt_w, opt_z, verb;
  49.   char buf[32], *fork_name;
  50.   
  51.   rep = 0; opt_c = 0; opt_n = 0; opt_s = 0; opt_w = 0; opt_z = 0; verb = 1;
  52.   while ((c = getopt (argc, argv, "cr:nqsvwz:")) != EOF)
  53.     switch (c)
  54.       {
  55.       case 'c':
  56.         opt_c = 1;
  57.         break;
  58.       case 'n':
  59.         opt_n = 1;
  60.         break;
  61.       case 'q':
  62.         verb = 0;
  63.         break;
  64.       case 'r':
  65.         rep = atoi (optarg);
  66.         break;
  67.       case 's':
  68.         opt_s = 1;
  69.         break;
  70.       case 'v':
  71.         verb = 2;
  72.         break;
  73.       case 'w':
  74.         opt_w = 1;
  75.         break;
  76.       case 'z':
  77.         opt_z = atoi (optarg);
  78.         break;
  79.       default:
  80.         usage ();
  81.       }
  82.   if (optind < argc)
  83.     usage ();
  84.   if (rep > 6)
  85.     {
  86.       printf ("*** That's too dangerous ***\n");
  87.       return (1);
  88.     }
  89.   if (opt_s)
  90.     signal (SIGCLD, handler);
  91.   v0 = v;
  92.   if (opt_n)
  93.     fork_name = "fork";
  94.   else
  95.     {
  96.       printf ("Here's fork%d (pid=%d, ppid=%d)\n", v0,
  97.               getpid (), getppid ());
  98.       fork_name = strdup ("fork"); /* test heap */
  99.     }
  100.   n = 0;
  101.   do
  102.     {
  103.       if (opt_z != 0)
  104.         sleep (opt_z);
  105.       ++v;
  106.       i = fork();
  107.       if (i < 0)
  108.         {
  109.           sprintf (buf, "fork%d: fork", v0);
  110.           perror (buf);
  111.           return (1);
  112.         }
  113.       else if (i == 0)
  114.         {
  115.           v0 = v; n = 0;
  116.           printf ("Here's forked %s%d (pid=%d, ppid=%d)\n",
  117.                   fork_name, v0, getpid (), getppid ());
  118.         }
  119.       else
  120.         {
  121.           ++n;
  122.           if (verb >= 1)
  123.             printf ("fork%d: forked fork has pid %d\n", v0, i);
  124.         }
  125.     } while (v <= rep);
  126.   if (opt_w && n > 0)
  127.     {
  128.       if (verb >= 2)
  129.         printf ("fork%d: waiting for %d child%s\n",
  130.                 v0, n, (n == 1 ? "" : "ren"));
  131.       while (n > 0)
  132.         {
  133.           p = wait (&t);
  134.           if (p == -1)
  135.             {
  136.               sprintf (buf, "fork%d: wait", v0);
  137.               perror (buf);
  138.               return (1);
  139.             }
  140.           else
  141.             {
  142.               --n;
  143.               if ((t & 0xff) == 0)
  144.                 printf ("fork%d: process %d terminated normally, rc=%d\n",
  145.                         v0, p, t >> 8);
  146.               else if ((t & 0xff) == 127)
  147.                 printf ("fork%d: process %d stopped by signal %d\n",
  148.                         v0, p, t >> 8);
  149.               else
  150.                 printf ("fork%d: process %d terminated by signal %d\n",
  151.                         v0, p, t & 0xff);
  152.             }
  153.         }
  154.     }
  155.   if (opt_c)
  156.     printf ("fork%d: clock=%ld\n", v0, (long)clock ());
  157.   if (verb >= 2)
  158.     printf ("fork%d: end\n", v0);
  159.   return (0);
  160. }
  161.