📄 ncbi_os_unix.cpp
字号:
/* * =========================================================================== * PRODUCTION $Log: ncbi_os_unix.cpp,v $ * PRODUCTION Revision 1000.1 2004/06/01 19:08:35 gouriano * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.2 * PRODUCTION * =========================================================================== *//* $Id: ncbi_os_unix.cpp,v 1000.1 2004/06/01 19:08:35 gouriano Exp $ * =========================================================================== * * PUBLIC DOMAIN NOTICE * National Center for Biotechnology Information * * This software/database is a "United States Government Work" under the * terms of the United States Copyright Act. It was written as part of * the author's official duties as a United States Government employee and * thus cannot be copyrighted. This software/database is freely available * to the public for use. The National Library of Medicine and the U.S. * Government have not placed any restriction on its use or reproduction. * * Although all reasonable efforts have been taken to ensure the accuracy * and reliability of the software and data, the NLM and the U.S. * Government do not and cannot warrant the performance or results that * may be obtained by using this software or data. The NLM and the U.S. * Government disclaim all warranties, express or implied, including * warranties of performance, merchantability or fitness for any particular * purpose. * * Please cite the author in any work or product based on this material. * * =========================================================================== * * Authors: Anton Lavrentiev * * File Description: * UNIX specifics * */#include <ncbi_pch.hpp>#include <corelib/ncbidiag.hpp>#include <corelib/ncbi_os_unix.hpp>#include <errno.h>#include <fcntl.h>#include <stdio.h>BEGIN_NCBI_SCOPEbool Daemonize(const char* logfile, TDaemonFlags flags){ int fdin = ::dup(STDIN_FILENO); int fdout = ::dup(STDOUT_FILENO); int fderr = ::dup(STDERR_FILENO); try { if (flags & fDaemon_KeepStdin) { int nullr = ::open("/dev/null", O_RDONLY); if (nullr < 0) throw "Error opening /dev/null for reading"; int error = ::dup2(nullr, STDIN_FILENO); int x_errno = errno; ::close(nullr); if (error < 0) { errno = x_errno; throw "Error redirecting stdin"; } } if (flags & fDaemon_KeepStdout) { int nullw = ::open("/dev/null", O_WRONLY); if (nullw < 0) throw "Error opening /dev/null for writing"; ::fflush(stdout); int error = ::dup2(nullw, STDOUT_FILENO); int x_errno = errno; ::close(nullw); if (error < 0) { ::dup2(fdin, STDIN_FILENO); errno = x_errno; throw "Error redirecting stdout"; } } if (logfile) { int fd = open(logfile, O_WRONLY | O_APPEND | O_CREAT, 0666); if (fd < 0) throw "Unable to open logfile for stderr"; ::fflush(stderr); int error = ::dup2(fd, STDERR_FILENO); int x_errno = errno; ::close(fd); if (error < 0) { ::dup2(fdin, STDIN_FILENO); ::dup2(fdout, STDOUT_FILENO); errno = x_errno; throw "Error redirecting stderr"; } } pid_t pid = fork(); if (pid == (pid_t)(-1)) { int x_errno = errno; ::dup2(fdin, STDIN_FILENO); ::dup2(fdout, STDOUT_FILENO); ::dup2(fderr, STDERR_FILENO); errno = x_errno; throw "Cannot fork"; } if (pid) ::_exit(0); if (!(flags & fDaemon_DontChroot)) (void) ::chdir("/"); // "/" always exists if (!(flags & fDaemon_KeepStdin)) ::fclose(stdin); ::close(fdin); if (!(flags & fDaemon_KeepStdout)) ::fclose(stdout); ::close(fdout); if (!logfile) ::fclose(stderr); ::close(fderr); ::setsid(); return true; } catch (const char* what) { int x_errno = errno; ERR_POST(string("[Daemonize] ") + what); ::close(fdin); ::close(fdout); ::close(fderr); errno = x_errno; } return false;}END_NCBI_SCOPE/* -------------------------------------------------------------------------- * $Log: ncbi_os_unix.cpp,v $ * Revision 1000.1 2004/06/01 19:08:35 gouriano * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.2 * * Revision 1.2 2004/05/14 13:59:26 gorelenk * Added include of ncbi_pch.hpp * * Revision 1.1 2003/09/30 20:53:56 lavr * Initial revision * * ========================================================================== */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -