This example calls four of the eight _spawn routines. When called without arguments from the command line, the program first runs the code for case PARENT. It spawns a copy of itself, waits for its child process to run, and then spawns a second child process. The instructions for the child process are blocked to run only if argv[0] and one parameter were passed (case CHILD). In its turn, each child process spawns a grandchild as a copy of the same program. The grandchild instructions are blocked by the existence of two passed parameters. The grandchild process can overlay the child process. Each of the processes prints a message identifying itself.
#include <stdio.h> #include <process.h>
#define PARENT 1 #define CHILD 2 #define GRANDCHILD 3
int main(int argc, char **argv, char **envp)
{
int result;
char *args[4];
switch(argc)
{
case PARENT: /* no argument was passed: spawn child and wait */
result = spawnle(P_WAIT, argv[0], argv[0], "one", NULL, envp);
if (result)
abort();
args[0] = argv[0];
args[1] = "two";
args[2] = NULL;
/* spawn another child, and wait for it */
result = spawnve(P_WAIT, argv[0], args, envp);
if (result)
abort();
printf("Parent process ended\n");
exit(0);
case CHILD: /* one argument passed: allow grandchild to overlay */
printf("child process %s began\n", argv[1]);
if (*argv[1] == 'o') /* child one? */
{
spawnl(P_OVERLAY, argv[0], argv[0], "one", "two", NULL);
abort(); /* not executed because child was overlaid */
}
if (*argv[1] == 't') /* child two? */
{
args[0] = argv[0];
args[1] = "two";
args[2] = "one";
args[3] = NULL;
spawnv(P_OVERLAY, argv[0], args);
abort(); /* not executed because child was overlaid */
}
abort(); /* argument not valid */
case GRANDCHILD: /* two arguments passed */
printf("grandchild %s ran\n", argv[1]);
exit(0);
}
/**************************************************************************
The output should be similar to:
child process one began
grandchild one ran
child process two began
Parent process ended
grandchild two ran
**************************************************************************/
}