Listing 4

/*  This program is called as follows

a.out exit_value program_name arguments...

exit_value is the value which the program will exit with

program_name is the name of the child process to exec, with
its arguments
*/

#include <stdio.h>
#include <signal.h>

static int RET_VALUE;
#define TRUE 1

main(argc,argv)
int argc;
char **argv;
{
RET_VALUE = atoi(argv[1]);
argc -= 2;
argv += 2;
process(argc,argv);
printf("Parent exiting with %d\n", RET_VALUE);
exit(RET_VALUE);
}

process(argc,argv)
int argc;
char **argv;
{
int pid;
int status;
int ret;
signal(SIGINT,SIG_IGN); /* Ignore interrupt key */
pid = fork();
if (pid == -1)
  {
  perror("all_true");
  exit(126);
  }

if (pid > 0 )
 {
 printf("In parent, waiting for child\n");
 /* In parent */
 /* Wait for child */
 ret = wait(&status);       printf("Exit status from child is %x\n", status);
 if (ret == -1)
    perror("all_true");
 return;
 }

/* In child */
printf("Executing %s in child\n", argv[0]);
signal(SIGINT, SIG_DFL);
execvp(*argv, argv);
perror("all_true");
}

/* End of File */