HPUX Fork[3]






 Tcl_Fork(3)                                                     Tcl_Fork(3)





 ___________________________________________________________________________

 NAME                                                                         |
      Tcl_Fork, Tcl_WaitPids, Tcl_DetachPids - manage child processes         |

 SYNOPSIS                                                                      |
      #include <tcl.h>                                                         |

      int                                                                      |
      Tcl_Fork( )                                                              |

      int                                                                      |
      Tcl_WaitPids(numPids, pidPtr, statusPtr)                                 |

      int                                                                      |
      Tcl_DetachPids(numPids, pidPtr)                                          |

 ARGUMENTS                                                                    |
      int   numPids      (in)      Number of process ids  contained  in  the  |
                                   array pointed to by pidPtr.                |

      int   *pidPtr      (in)       Address  of  array  containing   numPids  |
                                   process ids.                               |

      int   *statusPtr   (out)     Address of place to store status returned  |
                                   by exited/suspended process.               |
 ___________________________________________________________________________  |


 DESCRIPTION                                                                  |
      These procedures keep track of child processes in  order  to  make  it  |
      easier  for  one  application  to  manage  several  children.   If  an  |
      application uses  the  UNIX  fork  and  wait  kernel  calls  directly,  |
      problems occur in situations like the following:                        |

      [1]  One part of an application creates child C1.  It plans to let the  |
           child run in background, then later wait for it to complete.       |

      [2]  Some other part of the application creates another child C2,  not  |
           knowing anything about C1.                                         |

      [3]  The second part of the application uses wait to wait  for  C2  to  |
           complete.                                                          |

      [4]  C1 completes before C2, so C1 is  returned  by  the  wait  kernel  |
           call.                                                              |

      [5]  The second part of the application doesn't recognize  C1,  so  it  |
           ignores it and calls wait again.  This time C2 completes.          |





                                    - 1 -        Formatted:  August 11, 1996






 Tcl_Fork(3)                                                     Tcl_Fork(3)





      [6]  The first part of the application eventually decides to wait  for  |
           its  child to complete.  When it calls wait there are no children  |
           left, so wait returns an error and the application never gets  to  |
           examine the exit status for C1.                                    |

      The procedures Tcl_Fork, Tcl_WaitPids, and Tcl_DetachPids  get  around  |
      this  problem  by  keeping  a  table of child processes and their exit  |
      statuses.  They also provide a more flexible  waiting  mechanism  than  |
      the  wait  kernel call.  Tcl-based applications should never call fork  |
      and wait  directly;   they  should  use  Tcl_Fork,  Tcl_WaitPids,  and  |
      Tcl_DetachPids.                                                         |

      Tcl_Fork calls fork and returns the result of the  fork  kernel  call.  |
      If  the  fork  call  was  successful then Tcl_Fork also enters the new  |
      process into its internal table of child proceses.  If fork returns an  |
      error then Tcl_Fork returns that same error.                            |

      Tcl_WaitPids calls wait repeatedly until one of the processes  in  the  |
      pidPtr array has exited or been killed or suspended by a signal.  When  |
      this occurs, Tcl_WaitPids  returns  the  process  identifier  for  the  |
      process  and  stores its wait status at *statusPtr.  If the process no  |
      longer exists (it exited or was killed by a signal), then Tcl_WaitPids  |
      removes  its entry from the internal process table.  If wait returns a  |
      process that isn't in the pidPtr array, Tcl_WaitPids  saves  its  wait  |
      status  in the internal process table and calls wait again.  If one of  |
      the processes in the pidPtr array has already exited (or suspended  or  |
      been  killed)  when  Tcl_WaitPids is called, that process and its wait  |
      status are returned immediately without calling wait.                   |

      Tcl_WaitPids provides two advantages.  First, it allows  processes  to  |
      exit  in  any order, and saves their wait statuses.  Second, it allows  |
      waiting on a number of processes simultaneously, returning when any of  |
      the processes is returned by wait.                                      |

      Tcl_DetachPids is used to indicate  that  the  application  no  longer  |
      cares about the processes given by the pidPtr array and will never use  |
      Tcl_WaitPids to wait for them.  This occurs, for example,  if  one  or  |
      more  children are to be executed in background and the parent doesn't  |
      care whether  they  complete  successfully.   When  Tcl_DetachPids  is  |
      called,  the  internal  process  table  entries  for the processes are  |
      marked so that the entries will be removed as soon  as  the  processes  |
      exit or are killed.                                                     |

      If none of the pids passed to  Tcl_WaitPids  exists  in  the  internal  |
      process  table,  then -1 is returned and errno is set to ECHILD.  If a  |
      wait kernel call returns an error, then Tcl_WaitPids returns that same  |
      error.   If  a  wait  kernel  call returns a process that isn't in the  |
      internal  process  table,   Tcl_WaitPids   panics   and   aborts   the  |
      application.   If  this  situation occurs, it means that a process has  |
      been created without calling Tcl_Fork and  that  its  exit  status  is  |
      about to be lost.                                                       |



                                    - 2 -        Formatted:  August 11, 1996






 Tcl_Fork(3)                                                     Tcl_Fork(3)





      Tcl_WaitPids defines wait statuses to have type int, which is  correct  |
      for POSIX and many variants of UNIX. Some BSD-based UNIX systems still  |
      use type union wait for wait statuses;  it should be safe  to  cast  a  |
      pointer  to  a  union  wait  structure to (int *) before passing it to  |
      Tcl_WaitPids as in the following code:                                  |

           union wait status;                                                 |
           int pid1, pid2;                                                    |
           ...                                                                |
           pid2 = Tcl_WaitPids(1, &pid1, (int *) &status);                    |


 KEYWORDS                                                                     |
      background, child, detach, fork, process, status, wait                  |








































                                    - 3 -        Formatted:  August 11, 1996