/*
 * fork_and_wait.c
 * This will fork a child process. The 
 * child process will sleep for the given 
 * amount of secconds before exiting.
 * The parent process will wait for
 * the child to exit and then collect the
 * exit status. 
 *
 * to compile: gcc -O -pipe fork_and_wait.c -o fork_and_wait
 */

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>


int main(int argc, char **argv)
{
   int amount, status;
   pid_t child, wait_val;

   /*
    * This first arg to main is always the
    * program name !
    */
   if(argc > 1 )
   {
      amount = atoi(argv[1]);
      printf("PARENT: Spawing child\n");
      child = fork();

      /* Child process */
      if( child == 0 )
      {
	 /* 
	  * just sleep and exit 
	  */
	 printf("CHILD: Sleeping for [ %d ] secconds \n", amount);
	 sleep(amount);
	 exit(0);
      }
      else
      { 
	 /* 
	  * Parent 
	  * first initiate status to 0, then call wait 
	  */
	 status = 0;
	 printf("PARENT: Waiting child PID [ %d ] \n", child );
	 wait_val = waitpid(child, &status, 0);
	 
	 /*
	  * Now check the status of the child process
	  */
	 if( WIFEXITED(status) )
	 {
	    printf("PARENT: Child exited normally with exit satus [ %d ]\n", WEXITSTATUS(status));
	 }
	 
	 if( WIFSIGNALED(status) )
	 {
	    printf("PARENT: Child exited due to signal number [ %d ]\n", WTERMSIG(status) );
	 }
      } /* else, if (child  == 0 ) */

   } /* if(argc) */


   /* FIN */
   return(0);
}







syntax highlighted by Code2HTML, v. 0.9