home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Professional / OS2PRO194.ISO / os2 / prgramer / unix / emx / test / exec.c < prev    next >
C/C++ Source or Header  |  1993-01-02  |  6KB  |  221 lines

  1. /* exec.c (emx+gcc) */
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <process.h>
  7. #include <signal.h>
  8.  
  9. static int wp;
  10. static int gpid;
  11.  
  12. static void do_wait (void)
  13. {
  14.   int p, t;
  15.  
  16.   if (wp)
  17.     p = waitpid (gpid, &t, 0);
  18.   else
  19.     p = wait (&t);
  20.   if (p == -1)
  21.     perror ("wait");
  22.   else
  23.     {
  24.       if ((t & 0xff) == 0)
  25.         fprintf (stderr, "Process %d terminated normally, rc=%d\n",
  26.                  p, t >> 8);
  27.       else if ((t & 0xff) == 127)
  28.         fprintf (stderr, "Process %d stopped by signal %d\n",
  29.                  p, t >> 8);
  30.       else
  31.         fprintf (stderr, "Process %d terminated by signal %d\n",
  32.                  p, t & 0xff);
  33.     }
  34. }
  35.  
  36.  
  37. static void handler (int sig)
  38. {
  39.   if (sig == SIGCLD)
  40.     {
  41.       fprintf (stderr, "SIGCLD: "); fflush (stderr);
  42.       do_wait ();
  43.       fflush (stderr);
  44.       signal (SIGCLD, SIG_ACK);
  45.     }
  46.   else
  47.     {
  48.       printf ("Signal %d received. Process stopped.\n", sig);
  49.       exit (1);
  50.     }
  51. }
  52.  
  53.  
  54. int main (int argc, char *argv[])
  55. {
  56.   char buf[100], *p, *q, *r;
  57.   char *nenvp[1];
  58.   char *nargv[100];
  59.   char args[5000];
  60.   int i, j, mode, ask;
  61.   
  62.   signal (SIGINT, handler);
  63.   signal (SIGCLD, handler);
  64.   if (argc >= 2)
  65.     {
  66.       i = spawnvp (mode, argv[1], (const char * const *)&argv[1]);
  67.       if (i < 0)
  68.         perror ("spawnve");
  69.       else
  70.         printf ("rc=%d\n", i);
  71.       return (0);
  72.     }
  73.   ask = 0; wp = 0;
  74.   for (;;)
  75.     {
  76.       printf ("pid=%d\n", (int)getpid ());
  77.       printf ("command: ");
  78.       fflush (stdout);
  79.       if (fgets (buf, sizeof (buf), stdin) == NULL)
  80.         {
  81.           perror ("fgets"); return (1);
  82.         }
  83.       p = strchr (buf, '\n');
  84.       if (p != NULL) *p = 0;
  85.       p = buf;
  86.       if (*p == '?')
  87.         {
  88.           puts ("?      display help");
  89.           puts ("v=n    set environment variable V to value N");
  90.           puts ("-s p   send signal s to process p");
  91.           puts ("~c     run C asynchronously");
  92.           puts ("*c     run C as overlay");
  93.           puts ("#c     run C for debugging");
  94.           puts ("&c     run C detached");
  95.           puts ("%c     start session running C");
  96.           puts ("       Flags after %:");
  97.           puts ("         + maximized");
  98.           puts ("         - minimized");
  99.           puts ("         % full-screen");
  100.           puts ("         ! don't close window automatically");
  101.           puts ("         $ background");
  102.           puts ("+a      Toggle flag: ask for parameters");
  103.           puts ("+w      Toggle flag: use waitpid()");
  104.         }
  105.       else if (strchr (p, '=') != NULL)
  106.         {
  107.           if (putenv (p) != 0)
  108.             perror ("putenv");
  109.         }
  110.       else if (sscanf (p, "-%d %d", &i, &j) == 2)
  111.         {
  112.           if (kill (j, i) < 0)
  113.             perror ("kill");
  114.         }
  115.       else if (p[0] == '+' && p[1] == 'a')
  116.         ask = !ask;
  117.       else if (p[0] == '+' && p[1] == 'w')
  118.         wp = !wp;
  119.       else
  120.         {
  121.           if (*p == '*')
  122.             {
  123.               mode = P_OVERLAY; ++p;
  124.             }
  125.           else if (*p == '#')
  126.             {
  127.               mode = P_DEBUG; ++p;
  128.             }
  129.           else if (*p == '~')
  130.             {
  131.               mode = P_NOWAIT; ++p;
  132.             }
  133.           else if (*p == '&')
  134.             {
  135.               mode = P_DETACH; ++p;
  136.             }
  137.           else if (*p == '%')
  138.             {
  139.               mode = P_SESSION;
  140.               ++p;
  141.               if (*p == '-')
  142.                 {
  143.                   mode |= P_MINIMIZE; ++p;
  144.                 }
  145.               else if (*p == '+')
  146.                 {
  147.                   mode |= P_MAXIMIZE; ++p;
  148.                 }
  149.               else if (*p == '%')
  150.                 {
  151.                   mode |= P_FULLSCREEN; ++p;
  152.                 }
  153.               else
  154.                 mode |= P_WINDOWED;
  155.               if (*p == '!')
  156.                 {
  157.                   mode |= P_NOCLOSE; ++p;
  158.                 }
  159.               if (*p == '$')
  160.                 {
  161.                   mode |= P_BACKGROUND; ++p;
  162.                 }
  163.             }
  164.           else
  165.             mode = P_WAIT;
  166.           if (*p == 0)
  167.             {
  168.               printf ("done\n");
  169.               return (0);
  170.             }
  171.           i = 0;
  172.           q = p;
  173.           while ((nargv[i++] = strtok (q, " \t")) != NULL)
  174.             q = NULL;
  175.           if (ask)
  176.             {
  177.               printf ("Enter arguments, one per line (. to end):\n");
  178.               q = args; --i;
  179.               for (;;)
  180.                 {
  181.                   r = fgets (q, sizeof (args) - (q - args), stdin);
  182.                   if (r == NULL)
  183.                     return (0);
  184.                   r = strchr (q, '\n');
  185.                   if (r != NULL)
  186.                     *r = 0;
  187.                   else
  188.                     r = strchr (q, 0);
  189.                   if (strcmp (q, ".") == 0)
  190.                     break;
  191.                   nargv[i++] = q;
  192.                   q = r + 1;
  193.                 }
  194.               nargv[i] = NULL;
  195.             }
  196.           nenvp[0] = NULL;
  197. #if 1
  198.           gpid = spawnvpe (mode, p, (const char * const *)nargv, NULL);
  199. #else
  200.           gpid = spawnvpe (mode, p, (const char * const *)nargv,
  201.                            (const char * const *)nenvp);
  202. #endif
  203.           if (gpid < 0)
  204.             {
  205.               j = _syserrno ();
  206.               perror ("spawnve");
  207.               printf ("syserrno=%d\n", j);
  208.             }
  209.           else
  210.             printf ("rc=%d\n", gpid);
  211.         }
  212.     }
  213.   return (1);
  214. }
  215.  
  216. /*
  217.  * Local variables:
  218.  * compile-command: "make exec.exe"
  219.  * end:
  220.  */
  221.