daemon.c
上传用户:xiaozhuqw
上传日期:2009-11-15
资源大小:1338k
文件大小:2k
源码类别:

网络

开发平台:

Unix_Linux

  1. /*
  2.  * Daemonize routine
  3.  * Copyright (C) 1997, 1999 Kunihiro Ishiguro
  4.  * 
  5.  * This file is part of GNU Zebra.
  6.  *
  7.  * GNU Zebra is free software; you can redistribute it and/or modify
  8.  * it under the terms of the GNU General Public License as published
  9.  * by the Free Software Foundation; either version 2, or (at your
  10.  * option) any later version.
  11.  *
  12.  * GNU Zebra is distributed in the hope that it will be useful, but
  13.  * WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15.  * General Public License for more details.
  16.  *
  17.  * You should have received a copy of the GNU General Public License
  18.  * along with GNU Zebra; see the file COPYING.  If not, write to the
  19.  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  20.  * Boston, MA 02111-1307, USA.
  21.  */
  22. #include <zebra.h>
  23. #ifndef HAVE_DAEMON
  24. /* Daemonize myself. */
  25. int
  26. daemon (int nochdir, int noclose)
  27. {
  28.   pid_t pid;
  29.   pid = fork ();
  30.   /* In case of fork is error. */
  31.   if (pid < 0)
  32.     {
  33.       perror ("fork");
  34.       return -1;
  35.     }
  36.   /* In case of this is parent process. */
  37.   if (pid != 0)
  38.     exit (0);
  39.   /* Become session leader and get pid. */
  40.   pid = setsid();
  41.   if (pid < -1)
  42.     {
  43.       perror ("setsid");
  44.       return -1;
  45.     }
  46.   /* Change directory to root. */
  47.   if (! nochdir)
  48.     chdir ("/");
  49.   /* File descriptor close. */
  50.   if (! noclose)
  51.     {
  52.       int fd;
  53.       fd = open ("/dev/null", O_RDWR, 0);
  54.       if (fd != -1)
  55. {
  56.   dup2 (fd, STDIN_FILENO);
  57.   dup2 (fd, STDOUT_FILENO);
  58.   dup2 (fd, STDERR_FILENO);
  59.   if (fd > 2)
  60.     close (fd);
  61. }
  62.     }
  63.   umask (0027);
  64.   return 0;
  65. }
  66. #endif /* HAVE_DAEMON */