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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: ncbi_process.hpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/01 19:07:43  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.7
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef CORELIB__NCBIPROCESS__HPP
  10. #define CORELIB__NCBIPROCESS__HPP
  11. /*  $Id: ncbi_process.hpp,v 1000.3 2004/06/01 19:07: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.  * Authors:  Aaron Ucko, Vladimir Ivanov
  37.  *
  38.  *
  39.  */
  40. /// @file ncbip_rocess.hpp 
  41. /// Defines a process management classes.
  42. ///
  43. /// Defines classes: 
  44. ///     CProcess
  45. ///     CPIDGuard
  46. ///
  47. /// Implemented for: UNIX, MS-Windows
  48. #include <corelib/ncbi_limits.hpp>
  49. #if defined(NCBI_OS_UNIX)
  50. #  include <sys/types.h>
  51. #elif defined(NCBI_OS_MSWIN)
  52. #  include <corelib/ncbi_os_mswin.hpp>
  53. #endif
  54. /** @addtogroup Process
  55.  *
  56.  * @{
  57.  */
  58. BEGIN_NCBI_SCOPE
  59. /// Process identifier (PID) and process handle.
  60. #if defined(NCBI_OS_UNIX)
  61.   typedef pid_t  TPid;
  62.   typedef TPid   TProcessHandle;
  63. #elif defined(NCBI_OS_MSWIN)
  64.   typedef DWORD  TPid;
  65.   typedef HANDLE TProcessHandle;
  66. #else
  67.   typedef int    TPid;
  68.   typedef TPid   TProcessHandle;
  69. #endif
  70. /////////////////////////////////////////////////////////////////////////////
  71. ///
  72. /// CProcess --
  73. ///
  74. /// Process management functions.
  75. ///
  76. /// Class can work with process identifiers and process handles.
  77. /// On Unix both said terms are equivalent and correspond a pid.
  78. /// On MS Windows they are different.
  79. ///
  80. /// NOTE:  All CExec:: functions works with process handle.
  81. class NCBI_XNCBI_EXPORT CProcess
  82. {
  83. public:
  84.     /// How to interpret passed process identifier.
  85.     enum EProcessType {
  86.         ePid,     ///< As real process identifier (pid).
  87.         eHandle   ///< As a process handle.
  88.     };
  89.     /// Default process termination timeout.
  90.     static const unsigned long kDefaultKillTimeout;
  91.     /// Constructor.
  92.     CProcess(long process, EProcessType type = eHandle);
  93. #if defined(NCBI_OS_MSWIN)
  94.     CProcess(HANDLE process, EProcessType type = eHandle);
  95. #endif
  96.     /// Get process identifier for a current running process.
  97.     static TPid GetCurrentPid(void);
  98.     /// Check process existence.
  99.     ///
  100.     /// @return
  101.     ///   TRUE  - if the process is still running.
  102.     ///   FALSE - if the process did not exist or was already terminated.
  103.     /// @sa
  104.     ///   Wait(), WaitForAlive(), WaitForTerminate()
  105.     bool IsAlive(void) const;
  106.     /// Terminate process.
  107.     ///
  108.     /// @timeout
  109.     ///   Wait time in milliseconds between first "soft" and second "hard"
  110.     ///   attempts to terminate the process.
  111.     ///   Note that in case of zero or very small timeout the killing 
  112.     ///   process can be not released and continue to persists as zombie
  113.     ///   process even after call of this function.
  114.     /// @return
  115.     ///   TRUE  - if the process did not exist or was successfully terminated.
  116.     ///   FALSE - if the process is still running and cannot be terminated.
  117.     bool Kill(unsigned long timeout = kDefaultKillTimeout) const;
  118.     /// Wait until process terminates.
  119.     ///
  120.     /// Wait until the process has terminates or timeout expired.
  121.     /// Return immediately if specifed process has already terminated.
  122.     /// @param timeout
  123.     ///   Time-out interval in milliceconds. By default it is infinite.
  124.     /// @return
  125.     ///   - Exit code of the process, if no errors.
  126.     ///   - (-1), if error has occurred.
  127.     /// @sa
  128.     ///   IsAlive(), WaitForAlive(), WaitForTerminate()
  129.     int Wait(unsigned long timeout = kMax_ULong) const;
  130. private:
  131.     long          m_Process;   ///< Process identifier.
  132.     EProcessType  m_Type;      ///< Type of process identifier.
  133. };
  134. /////////////////////////////////////////////////////////////////////////////
  135. ///
  136. /// CPIDGuardException --
  137. ///
  138. class NCBI_XNCBI_EXPORT CPIDGuardException
  139.     : EXCEPTION_VIRTUAL_BASE public CException
  140. {
  141. public:
  142.     enum EErrCode {
  143.         eStillRunning, ///< The process listed in the file is still around.
  144.         eWrite         ///< Unable to write into the PID file.
  145.     };
  146.     virtual const char* GetErrCodeString(void) const
  147.     {
  148.         switch (GetErrCode()) {
  149.         case eStillRunning: return "eStillRunning";
  150.         case eWrite:        return "eWrite";
  151.         default:            return CException::GetErrCodeString();
  152.         }
  153.     }
  154.     /// Constructor.
  155.     CPIDGuardException(const char* file, int line,
  156.                        const CException* prev_exception, EErrCode err_code,
  157.                        const string& message, TPid pid = 0)
  158.         throw()
  159.         : CException(file, line, prev_exception, CException::eInvalid,
  160.                      message),
  161.           m_PID(pid)
  162.         NCBI_EXCEPTION_DEFAULT_IMPLEMENTATION(CPIDGuardException, CException);
  163. public:
  164.     virtual void ReportExtra(ostream& out) const
  165.     {
  166.         out << "pid " << m_PID;
  167.     }
  168.     TPid GetPID(void) const throw() { return m_PID; }
  169. protected:
  170.     virtual void x_Assign(const CException& src)
  171.     {
  172.         CException::x_Assign(src);
  173.         m_PID = dynamic_cast<const CPIDGuardException&>(src).m_PID;
  174.     }
  175. private:
  176.     TPid  m_PID;
  177. };
  178. /////////////////////////////////////////////////////////////////////////////
  179. ///
  180. /// CPIDGuard --
  181. ///
  182. class NCBI_XNCBI_EXPORT CPIDGuard
  183. {
  184. public:
  185.     /// If "filename" contains no path, make it relative to "dir"
  186.     /// (which defaults to /tmp on Unix and %HOME% on Windows).
  187.     /// If the file already exists and identifies a live process,
  188.     /// throws CPIDGuardException.
  189.     CPIDGuard(const string& filename, const string& dir = kEmptyStr);
  190.     /// Destructor.
  191.     ///
  192.     /// Just calls Release();
  193.     ~CPIDGuard(void);
  194.     /// Returns non-zero if there was a stale file.
  195.     TPid GetOldPID(void) { return m_OldPID; }
  196.     /// Release PID.
  197.     ///
  198.     /// Decrease reference counter for current PID and remove the file
  199.     /// if it is not used more (reference counter is 0).
  200.     void Release(void);
  201.     /// Remove the file.
  202.     ///
  203.     /// Remove PID file forcibly, ignoring any reference counter.
  204.     void Remove(void);
  205.     /// Update PID in the file.
  206.     ///
  207.     /// @param pid
  208.     ///   The new process ID to store (defaults to the current PID);
  209.     ///   useful when the real work occurs in a child process that outlives
  210.     ///   the parent.
  211.     void UpdatePID(TPid pid = 0);
  212. private:
  213.     string  m_Path;     //< File path to store PID.
  214.     TPid    m_OldPID;   //< Old PID read from file.
  215.     TPid    m_NewPID;   //< New PID wroted to file.
  216. };
  217. END_NCBI_SCOPE
  218. /* @} */
  219. /*
  220.  * ===========================================================================
  221.  * $Log: ncbi_process.hpp,v $
  222.  * Revision 1000.3  2004/06/01 19:07:43  gouriano
  223.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.7
  224.  *
  225.  * Revision 1.7  2004/05/18 16:59:09  ivanov
  226.  * CProcess::
  227.  *     + WaitForAlive(), WaitForTerminate().
  228.  * CPIDGuard::
  229.  *     Fixed CPIDGuard to use reference counters in PID file.
  230.  *     Added CPIDGuard::Remove().
  231.  *
  232.  * Revision 1.6  2004/04/01 14:14:01  lavr
  233.  * Spell "occurred", "occurrence", and "occurring"
  234.  *
  235.  * Revision 1.5  2003/12/23 19:05:24  ivanov
  236.  * Get rid of Sun Workshop compilation warning about x_Assign
  237.  *
  238.  * Revision 1.4  2003/12/04 18:45:06  ivanov
  239.  * Added helper constructor for MS Windows to avoid cast from HANDLE to long
  240.  *
  241.  * Revision 1.3  2003/12/03 17:04:00  ivanov
  242.  * Comments changes
  243.  *
  244.  * Revision 1.2  2003/10/01 20:23:58  ivanov
  245.  * Added const specifier to CProcess class member functions
  246.  *
  247.  * Revision 1.1  2003/09/25 16:52:08  ivanov
  248.  * Initial revision. CPIDGuard class moved from ncbi_system.hpp.
  249.  *
  250.  * ===========================================================================
  251.  */
  252. #endif  /* CORELIB__NCBIPROCESS__HPP */