ncbiexec.hpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:21k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: ncbiexec.hpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/04/21 14:34:43  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.13
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef CORELIB__NCBIEXEC__HPP
  10. #define CORELIB__NCBIEXEC__HPP
  11. /*  $Id: ncbiexec.hpp,v 1000.1 2004/04/21 14:34:43 gouriano Exp $
  12.  * ===========================================================================
  13.  *
  14.  *                            PUBLIC DOMAIN NOTICE
  15.  *               National Center for Biotechnology Information
  16.  *
  17.  *  This software/database is a "United States Government Work" under the
  18.  *  terms of the United States Copyright Act.  It was written as part of
  19.  *  the author's official duties as a United States Government employee and
  20.  *  thus cannot be copyrighted.  This software/database is freely available
  21.  *  to the public for use. The National Library of Medicine and the U.S.
  22.  *  Government have not placed any restriction on its use or reproduction.
  23.  *
  24.  *  Although all reasonable efforts have been taken to ensure the accuracy
  25.  *  and reliability of the software and data, the NLM and the U.S.
  26.  *  Government do not and cannot warrant the performance or results that
  27.  *  may be obtained by using this software or data. The NLM and the U.S.
  28.  *  Government disclaim all warranties, express or implied, including
  29.  *  warranties of performance, merchantability or fitness for any particular
  30.  *  purpose.
  31.  *
  32.  *  Please cite the author in any work or product based on this material.
  33.  *
  34.  * ===========================================================================
  35.  *
  36.  * Author:  Vladimir Ivanov
  37.  *
  38.  *
  39.  */
  40. /// @file ncbiexec.hpp 
  41. /// Defines a portable execute class.
  42. #include <corelib/ncbistd.hpp>
  43. #include <corelib/ncbi_limits.hpp>
  44. /** @addtogroup Exec
  45.  *
  46.  * @{
  47.  */
  48. BEGIN_NCBI_SCOPE
  49. /////////////////////////////////////////////////////////////////////////////
  50. ///
  51. /// CExecException --
  52. ///
  53. /// Define exceptions generated by CExec.
  54. ///
  55. /// CExecException inherits its basic functionality from
  56. /// CErrnoTemplException<CCoreException> and defines additional error codes
  57. /// for errors generated by CExec.
  58. class NCBI_XNCBI_EXPORT CExecException : 
  59.                         public CErrnoTemplException<CCoreException>
  60. {
  61. public:
  62.     /// Error types that CExec can generate.
  63.     enum EErrCode {
  64.         eSystem,        ///< System error
  65.         eSpawn          ///< Spawn error
  66.     };
  67.     /// Translate from the error code value to its string representation.
  68.     virtual const char* GetErrCodeString(void) const
  69.     {
  70.         switch (GetErrCode()) {
  71.         case eSystem: return "eSystem";
  72.         case eSpawn:  return "eSpawn";
  73.         default:      return CException::GetErrCodeString();
  74.         }
  75.     }
  76.     // Standard exception boilerplate code.
  77.     NCBI_EXCEPTION_DEFAULT(CExecException,
  78.                            CErrnoTemplException<CCoreException>);
  79. };
  80. /////////////////////////////////////////////////////////////////////////////
  81. ///
  82. /// CExec --
  83. ///
  84. /// Define portable exec class.
  85. ///
  86. /// Defines the different ways a process can be spawned.
  87. /// NOTE:  In the eNoWait and eDetach modes Spawn functions returns a process
  88. ///        handle. On MS Windows it is a real process handle of type HANDLE.
  89. ///        On UNIX it is a process identifier (pid).
  90. class NCBI_XNCBI_EXPORT CExec
  91. {
  92. public:
  93.     /// Which exec mode the spawned process is called with.
  94.     enum EMode {
  95.         eOverlay = 0, ///< Overlays calling process with new process,
  96.                       ///< destroying calling process. 
  97.         eWait    = 1, ///< Suspends calling thread until execution of new 
  98.                       ///< process is complete (synchronous operation).
  99.         eNoWait  = 2, ///< Continues to execute calling process concurrently 
  100.                       ///< with new process (asynchronous process).
  101.         eDetach  = 3  ///< Continues to execute calling process; new process 
  102.                       ///< is run in background with no access to console or 
  103.                       ///< keyboard; calls to Wait() against new process will
  104.                       ///< fail; this is an asynchronous spawn.
  105.     };
  106.     /// Execute the specified command.
  107.     ///
  108.     /// Execute the command and return the executed command's exit code.
  109.     /// Throw an exception if command failed to execute. If cmdline is a null
  110.     /// pointer, System() checks if the shell (command interpreter) exists and
  111.     /// is executable. If the shell is available, System() returns a non-zero
  112.     /// value; otherwise, it returns 0.
  113.     static int System(const char* cmdline);
  114.     /// Spawn a new process with specified command-line arguments.
  115.     ///
  116.     /// In the SpawnL() version, the command-line arguments are passed
  117.     /// individually. SpawnL() is typically used when number of parameters to
  118.     /// the new process is known in advance.
  119.     ///
  120.     /// Meaning of the suffix "L" in method name:
  121.     /// - The letter "L" as suffix refers to the fact that command-line
  122.     ///   arguments are passed separately as arguments.
  123.     ///
  124.     /// NOTE: At least one argument must be present. This argument is always, 
  125.     /// by convention, the name of the file being spawned (argument with 
  126.     /// number 0).
  127.     /// @param mode
  128.     ///   Mode for running the process.
  129.     /// @param cmdline
  130.     ///   Command-line string.
  131.     /// @param argv
  132.     ///   Argument vector.
  133.     /// @return 
  134.     ///   On success, return:
  135.     ///     - exit code      - in eWait mode.
  136.     ///     - process handle - in eNoWait and eDetach modes.
  137.     ///     - nothing        - in eOverlay mode.   
  138.     ///   Throw an exception if command failed to execute.
  139.     /// @sa
  140.     ///   SpawnLE(), SpawnLP(), SpawnLPE(), SpawnV(), SpawnVE(), SpawnVP(), 
  141.     ///   SpawnVPE().
  142.     static int SpawnL(EMode mode, const char *cmdname, 
  143.                       const char *argv, ... /*, NULL */);
  144.     /// Spawn a new process with specified command-line arguments and
  145.     /// environment settings.
  146.     ///
  147.     /// In the SpawnLE() version, the command-line arguments and environment
  148.     /// pointer are passed individually. SpawnLE() is typically used when
  149.     /// number of parameters to the new process and individual environment 
  150.     /// parameter settings are known in advance.
  151.     ///
  152.     /// Meaning of the suffix "LE" in method name:
  153.     /// - The letter "L" as suffix refers to the fact that command-line
  154.     ///   arguments are passed separately as arguments.
  155.     /// - The letter "E" as suffix refers to the fact that environment pointer,
  156.     ///   envp, is passed as an array of pointers to environment settings to 
  157.     ///   the new process. The NULL environment pointer indicates that the new 
  158.     ///   process will inherit the parents process's environment.
  159.     ///
  160.     /// NOTE: At least one argument must be present. This argument is always, 
  161.     /// by convention, the name of the file being spawned (argument with 
  162.     /// number 0).
  163.     /// @param mode
  164.     ///   Mode for running the process.
  165.     /// @param cmdline
  166.     ///   Command-line string.
  167.     /// @param argv
  168.     ///   Argument vector.
  169.     /// @param ...
  170.     ///   NULL, const char* envp[]
  171.     /// @return 
  172.     ///   On success, return:
  173.     ///     - exit code      - in eWait mode.
  174.     ///     - process handle - in eNoWait and eDetach modes.
  175.     ///     - nothing        - in eOverlay mode.   
  176.     ///   Throw an exception if command failed to execute.
  177.     /// @sa
  178.     ///   SpawnL(), SpawnLP(), SpawnLPE(), SpawnV(), SpawnVE(), SpawnVP(), 
  179.     ///   SpawnVPE().
  180.     static int SpawnLE (EMode mode, const char *cmdname, 
  181.                         const char *argv, ... /*, NULL, const char *envp[] */);
  182.     /// Spawn a new process with variable number of command-line arguments and
  183.     /// find file to execute from the PATH environment variable.
  184.     ///
  185.     /// In the SpawnLP() version, the command-line arguments are passed
  186.     /// individually and the PATH environment variable is used to find the
  187.     /// file to execute. SpawnLP() is typically used when number
  188.     /// of parameters to the new process is known in advance but the exact
  189.     /// path to the executable is not known.
  190.     ///
  191.     /// Meaning of the suffix "LP" in method name:
  192.     /// - The letter "L" as suffix refers to the fact that command-line
  193.     ///   arguments are passed separately as arguments.
  194.     /// - The letter "P" as suffix refers to the fact that the PATH
  195.     ///   environment variable is used to find file to execute - on a Unix
  196.     ///   platform this feature works in functions without letter "P" in
  197.     ///   function name. 
  198.     ///
  199.     /// NOTE: At least one argument must be present. This argument is always, 
  200.     /// by convention, the name of the file being spawned (argument with 
  201.     /// number 0).
  202.     /// @param mode
  203.     ///   Mode for running the process.
  204.     /// @param cmdline
  205.     ///   Command-line string.
  206.     /// @param argv
  207.     ///   Argument vector.
  208.     /// @param ...
  209.     ///   NULL
  210.     /// @return 
  211.     ///   On success, return:
  212.     ///     - exit code      - in eWait mode.
  213.     ///     - process handle - in eNoWait and eDetach modes.
  214.     ///     - nothing        - in eOverlay mode.   
  215.     ///   Throw an exception if command failed to execute.
  216.     /// @sa
  217.     ///   SpawnL(), SpawnLE(), SpawnLPE(), SpawnV(), SpawnVE(), SpawnVP(), 
  218.     ///   SpawnVPE().
  219.     static int SpawnLP(EMode mode, const char *cmdname,
  220.                         const char *argv, ... /*, NULL */);
  221.     /// Spawn a new process with specified command-line arguments, 
  222.     /// environment settings and find file to execute from the PATH
  223.     /// environment variable.
  224.     ///
  225.     /// In the SpawnLPE() version, the command-line arguments and environment
  226.     /// pointer are passed individually, and the PATH environment variable
  227.     /// is used to find the file to execute. SpawnLPE() is typically used when
  228.     /// number of parameters to the new process and individual environment
  229.     /// parameter settings are known in advance, but the exact path to the
  230.     /// executable is not known.
  231.     ///
  232.     /// Meaning of the suffix "LPE" in method name:
  233.     /// - The letter "L" as suffix refers to the fact that command-line
  234.     ///   arguments are passed separately as arguments.
  235.     /// - The letter "P" as suffix refers to the fact that the PATH
  236.     ///   environment variable is used to find file to execute - on a Unix
  237.     ///   platform this feature works in functions without letter "P" in
  238.     ///   function name. 
  239.     /// - The letter "E" as suffix refers to the fact that environment pointer,
  240.     ///   envp, is passed as an array of pointers to environment settings to 
  241.     ///   the new process. The NULL environment pointer indicates that the new 
  242.     ///   process will inherit the parents process's environment.
  243.     ///
  244.     /// NOTE: At least one argument must be present. This argument is always, 
  245.     /// by convention, the name of the file being spawned (argument with 
  246.     /// number 0).
  247.     /// @param mode
  248.     ///   Mode for running the process.
  249.     /// @param cmdline
  250.     ///   Command-line string.
  251.     /// @param argv
  252.     ///   Argument vector.
  253.     /// @param ...
  254.     ///   NULL, const char* envp[]
  255.     /// @return 
  256.     ///   On success, return:
  257.     ///     - exit code      - in eWait mode.
  258.     ///     - process handle - in eNoWait and eDetach modes.
  259.     ///     - nothing        - in eOverlay mode.   
  260.     ///    Throw an exception if command failed to execute.
  261.     /// @sa
  262.     ///   SpawnL(), SpawnLE(), SpawnLP(), SpawnV(), SpawnVE(), SpawnVP(), 
  263.     ///   SpawnVPE().
  264.     static int SpawnLPE(EMode mode, const char *cmdname,
  265.                         const char *argv, ... /*, NULL, const char *envp[] */);
  266.     /// Spawn a new process with variable number of command-line arguments. 
  267.     ///
  268.     /// In the SpawnV() version, the command-line arguments are a variable
  269.     /// number. The array of pointers to arguments must have a length of 1 or
  270.     /// more and you must assign parameters for the new process beginning
  271.     /// from 1.
  272.     ///
  273.     /// Meaning of the suffix "V" in method name:
  274.     /// - The letter "V" as suffix refers to the fact that the number of
  275.     /// command-line arguments are variable.
  276.     ///
  277.     /// NOTE: At least one argument must be present. This argument is always, 
  278.     /// by convention, the name of the file being spawned (argument with 
  279.     /// number 0).
  280.     /// @param mode
  281.     ///   Mode for running the process.
  282.     /// @param cmdline
  283.     ///   Command-line string.
  284.     /// @param argv
  285.     ///   Argument vector.
  286.     /// @return 
  287.     ///   On success, return:
  288.     ///     - exit code      - in eWait mode.
  289.     ///     - process handle - in eNoWait and eDetach modes.
  290.     ///     - nothing        - in eOverlay mode.   
  291.     ///   Throw an exception if command failed to execute.
  292.     /// @sa
  293.     ///   SpawnL(), SpawnLE(), SpawnLP(), SpawnLPE(), SpawnVE(), SpawnVP(), 
  294.     ///   SpawnVPE().
  295.     static int SpawnV(EMode mode, const char *cmdname,
  296.                       const char *const *argv);
  297.     /// Spawn a new process with variable number of command-line arguments
  298.     /// and specified environment settings.
  299.     ///
  300.     /// In the SpawnVE() version, the command-line arguments are a variable
  301.     /// number. The array of pointers to arguments must have a length of 1 or
  302.     /// more and you must assign parameters for the new process beginning from
  303.     /// 1.  The individual environment parameter settings are known in advance
  304.     /// and passed explicitly.
  305.     ///
  306.     /// Meaning of the suffix "VE" in method name:
  307.     /// - The letter "V" as suffix refers to the fact that the number of
  308.     ///   command-line arguments are variable.
  309.     /// - The letter "E" as suffix refers to the fact that environment pointer,
  310.     ///   envp, is passed as an array of pointers to environment settings to 
  311.     ///   the new process. The NULL environment pointer indicates that the new 
  312.     ///   process will inherit the parents process's environment.
  313.     ///
  314.     /// NOTE: At least one argument must be present. This argument is always, 
  315.     /// by convention, the name of the file being spawned (argument with 
  316.     /// number 0).
  317.     /// @param mode
  318.     ///   Mode for running the process.
  319.     /// @param cmdline
  320.     ///   Command-line string.
  321.     /// @param argv
  322.     ///   Argument vector.
  323.     /// @return 
  324.     ///   On success, return:
  325.     ///     - exit code      - in eWait mode.
  326.     ///     - process handle - in eNoWait and eDetach modes.
  327.     ///     - nothing        - in eOverlay mode.   
  328.     ///   Throw an exception if command failed to execute.
  329.     /// @sa
  330.     ///   SpawnL(), SpawnLE(), SpawnLP(), SpawnLPE(), SpawnV(), SpawnVP(), 
  331.     ///   SpawnVPE().
  332.     static int SpawnVE(EMode mode, const char *cmdname,
  333.                        const char *const *argv, const char *const *envp);
  334.     /// Spawn a new process with variable number of command-line arguments and
  335.     /// find file to execute from the PATH environment variable.
  336.     ///
  337.     /// In the SpawnVP() version, the command-line arguments are a variable
  338.     /// number. The array of pointers to arguments must have a length of 1 or
  339.     /// more and you must assign parameters for the new process beginning from
  340.     /// 1. The PATH environment variable is used to find the file to execute.
  341.     ///
  342.     /// Meaning of the suffix "VP" in method name:
  343.     /// - The letter "V" as suffix refers to the fact that the number of
  344.     ///   command-line arguments are variable.
  345.     /// - The letter "P" as suffix refers to the fact that the PATH
  346.     ///   environment variable is used to find file to execute - on a Unix
  347.     ///   platform this feature works in functions without letter "P" in
  348.     ///   function name. 
  349.     ///
  350.     /// NOTE: At least one argument must be present. This argument is always, 
  351.     /// by convention, the name of the file being spawned (argument with 
  352.     /// number 0).
  353.     /// @param mode
  354.     ///   Mode for running the process.
  355.     /// @param cmdline
  356.     ///   Command-line string.
  357.     /// @param argv
  358.     ///   Argument vector.
  359.     /// @param ...
  360.     ///   NULL, const char* envp[]
  361.     /// @return 
  362.     ///   On success, return:
  363.     ///     - exit code      - in eWait mode.
  364.     ///     - process handle - in eNoWait and eDetach modes.
  365.     ///     - nothing        - in eOverlay mode.   
  366.     ///   Throw an exception if command failed to execute.
  367.     /// @sa
  368.     ///   SpawnL(), SpawnLE(), SpawnLP(), SpawnLPE(), SpawnV(), SpawnVE(), 
  369.     ///   SpawnVPE().
  370.     static int SpawnVP(EMode mode, const char *cmdname,
  371.                        const char *const *argv);
  372.     /// Spawn a new process with variable number of command-line arguments
  373.     /// and specified environment settings, and find the file to execute
  374.     /// from the PATH environment variable.
  375.     ///
  376.     /// In the SpawnVPE() version, the command-line arguments are a variable
  377.     /// number. The array of pointers to arguments must have a length of 1 or
  378.     /// more and you must assign parameters for the new process beginning from
  379.     /// 1. The PATH environment variable is used to find the file to execute,
  380.     /// and the environment is passed via an environment vector pointer.
  381.     ///
  382.     /// Meaning of the suffix "VPE" in method name:
  383.     /// - The letter "V" as suffix refers to the fact that the number of
  384.     ///   command-line arguments are variable.
  385.     /// - The letter "P" as suffix refers to the fact that the PATH
  386.     ///   environment variable is used to find file to execute - on a Unix
  387.     ///   platform this feature works in functions without letter "P" in
  388.     ///   function name. 
  389.     /// - The letter "E" as suffix refers to the fact that environment pointer,
  390.     ///   envp, is passed as an array of pointers to environment settings to 
  391.     ///   the new process. The NULL environment pointer indicates that the new 
  392.     ///   process will inherit the parents process's environment.
  393.     ///
  394.     /// NOTE: At least one argument must be present. This argument is always, 
  395.     /// by convention, the name of the file being spawned (argument with 
  396.     /// number 0).
  397.     /// @param mode
  398.     ///   Mode for running the process.
  399.     /// @param cmdline
  400.     ///   Command-line string.
  401.     /// @param argv
  402.     ///   Argument vector.
  403.     /// @return 
  404.     ///   On success, return:
  405.     ///     - exit code      - in eWait mode.
  406.     ///     - process handle - in eNoWait and eDetach modes.
  407.     ///     - nothing        - in eOverlay mode.   
  408.     ///   Throw an exception if command failed to execute.
  409.     /// @sa
  410.     ///   SpawnL(), SpawnLE(), SpawnLP(), SpawnLPE(), SpawnV(), SpawnVE(),
  411.     ///   SpawnVP(), 
  412.     static int SpawnVPE(EMode mode, const char *cmdname,
  413.                         const char *const *argv, const char *const *envp);
  414.     /// Wait until child process terminates.
  415.     ///
  416.     /// Wait until the child process with "handle" terminates, and return
  417.     /// immeditately if the specifed child process has already terminated.
  418.     /// @param handle
  419.     ///   Wait on child process with identifier "handle", returned by one 
  420.     ///   of the Spawn* function in eNoWait and eDetach modes.
  421.     /// @param timeout
  422.     ///   Time-out interval. By default it is infinite.
  423.     /// @return
  424.     ///   - Exit code of child process, if no errors.
  425.     ///   - (-1), if error has occurred.
  426.     static int Wait(int handle, unsigned long timeout = kMax_ULong);
  427. };
  428. END_NCBI_SCOPE
  429. /* @} */
  430. /*
  431.  * ===========================================================================
  432.  * $Log: ncbiexec.hpp,v $
  433.  * Revision 1000.1  2004/04/21 14:34:43  gouriano
  434.  * PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.13
  435.  *
  436.  * Revision 1.13  2004/04/01 14:14:01  lavr
  437.  * Spell "occurred", "occurrence", and "occurring"
  438.  *
  439.  * Revision 1.12  2003/09/25 17:59:12  ivanov
  440.  * Comment changes
  441.  *
  442.  * Revision 1.11  2003/09/25 17:19:05  ucko
  443.  * CExec::Wait: add an optional timeout argument per the new (forwarding)
  444.  * implementation.
  445.  *
  446.  * Revision 1.10  2003/09/16 17:48:03  ucko
  447.  * Remove redundant "const"s from arguments passed by value.
  448.  *
  449.  * Revision 1.9  2003/09/16 15:22:31  ivanov
  450.  * Minor comments changes
  451.  *
  452.  * Revision 1.8  2003/07/30 11:08:44  siyan
  453.  * Documentation changes.
  454.  *
  455.  * Revision 1.7  2003/03/31 16:40:07  siyan
  456.  * Added doxygen support
  457.  *
  458.  * Revision 1.6  2003/02/24 19:54:52  gouriano
  459.  * use template-based exceptions instead of errno and parse exceptions
  460.  *
  461.  * Revision 1.5  2002/12/18 22:53:21  dicuccio
  462.  * Added export specifier for building DLLs in windows.  Added global list of
  463.  * all such specifiers in mswin_exports.hpp, included through ncbistl.hpp
  464.  *
  465.  * Revision 1.4  2002/07/11 14:17:54  gouriano
  466.  * exceptions replaced by CNcbiException-type ones
  467.  *
  468.  * Revision 1.3  2002/06/10 18:55:27  ivanov
  469.  * Added comment note about arguments with spaces inside
  470.  *
  471.  * Revision 1.2  2002/05/31 20:48:39  ivanov
  472.  * Clean up code
  473.  *
  474.  * Revision 1.1  2002/05/30 16:30:45  ivanov
  475.  * Initial revision
  476.  *
  477.  * ===========================================================================
  478.  */
  479. #endif  /* CORELIB__NCBIEXEC__HPP */