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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: ncbi_os_unix.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:08:35  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.2
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: ncbi_os_unix.cpp,v 1000.1 2004/06/01 19:08:35 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Authors:  Anton Lavrentiev
  35.  *
  36.  * File Description:
  37.  *   UNIX specifics
  38.  *
  39.  */
  40. #include <ncbi_pch.hpp>
  41. #include <corelib/ncbidiag.hpp>
  42. #include <corelib/ncbi_os_unix.hpp>
  43. #include <errno.h>
  44. #include <fcntl.h>
  45. #include <stdio.h>
  46. BEGIN_NCBI_SCOPE
  47. bool Daemonize(const char* logfile, TDaemonFlags flags)
  48. {
  49.     int fdin  = ::dup(STDIN_FILENO);
  50.     int fdout = ::dup(STDOUT_FILENO);
  51.     int fderr = ::dup(STDERR_FILENO);
  52.     try {
  53.         if (flags & fDaemon_KeepStdin) {
  54.             int nullr = ::open("/dev/null", O_RDONLY);
  55.             if (nullr < 0)
  56.                 throw "Error opening /dev/null for reading";
  57.             int error = ::dup2(nullr, STDIN_FILENO);
  58.             int x_errno = errno;
  59.             ::close(nullr);
  60.             if (error < 0) {
  61.                 errno = x_errno;
  62.                 throw "Error redirecting stdin";
  63.             }
  64.         }
  65.         if (flags & fDaemon_KeepStdout) {
  66.             int nullw = ::open("/dev/null", O_WRONLY);
  67.             if (nullw < 0)
  68.                 throw "Error opening /dev/null for writing";
  69.             ::fflush(stdout);
  70.             int error = ::dup2(nullw, STDOUT_FILENO);
  71.             int x_errno = errno;
  72.             ::close(nullw);
  73.             if (error < 0) {
  74.                 ::dup2(fdin, STDIN_FILENO);
  75.                 errno = x_errno;
  76.                 throw "Error redirecting stdout";
  77.             }
  78.         }
  79.         if (logfile) {
  80.             int fd = open(logfile, O_WRONLY | O_APPEND | O_CREAT, 0666);
  81.             if (fd < 0)
  82.                 throw "Unable to open logfile for stderr";
  83.             ::fflush(stderr);
  84.             int error = ::dup2(fd, STDERR_FILENO);
  85.             int x_errno = errno;
  86.             ::close(fd);
  87.             if (error < 0) {
  88.                 ::dup2(fdin,  STDIN_FILENO);
  89.                 ::dup2(fdout, STDOUT_FILENO);
  90.                 errno = x_errno;
  91.                 throw "Error redirecting stderr";
  92.             }
  93.         }
  94.         pid_t pid = fork();
  95.         if (pid == (pid_t)(-1)) {
  96.             int x_errno = errno;
  97.             ::dup2(fdin,  STDIN_FILENO);
  98.             ::dup2(fdout, STDOUT_FILENO);
  99.             ::dup2(fderr, STDERR_FILENO);
  100.             errno = x_errno;
  101.             throw "Cannot fork";
  102.         }
  103.         if (pid)
  104.             ::_exit(0);
  105.         if (!(flags & fDaemon_DontChroot))
  106.             (void) ::chdir("/"); // "/" always exists
  107.         if (!(flags & fDaemon_KeepStdin))
  108.             ::fclose(stdin);
  109.         ::close(fdin);
  110.         if (!(flags & fDaemon_KeepStdout))
  111.             ::fclose(stdout);
  112.         ::close(fdout);
  113.         if (!logfile)
  114.             ::fclose(stderr);
  115.         ::close(fderr);
  116.         ::setsid();
  117.         return true;
  118.     }
  119.     catch (const char* what) {
  120.         int x_errno = errno;
  121.         ERR_POST(string("[Daemonize]  ") + what);
  122.         ::close(fdin);
  123.         ::close(fdout);
  124.         ::close(fderr);
  125.         errno = x_errno;
  126.     }
  127.     return false;
  128. }
  129. END_NCBI_SCOPE
  130. /* --------------------------------------------------------------------------
  131.  * $Log: ncbi_os_unix.cpp,v $
  132.  * Revision 1000.1  2004/06/01 19:08:35  gouriano
  133.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.2
  134.  *
  135.  * Revision 1.2  2004/05/14 13:59:26  gorelenk
  136.  * Added include of ncbi_pch.hpp
  137.  *
  138.  * Revision 1.1  2003/09/30 20:53:56  lavr
  139.  * Initial revision
  140.  *
  141.  * ==========================================================================
  142.  */