home *** CD-ROM | disk | FTP | other *** search
/ Il CD di internet / CD.iso / SOURCE / N / TCPIP / YP-CLIEN.TAR / yp.bin / daemon.c next >
Encoding:
C/C++ Source or Header  |  1994-05-12  |  2.7 KB  |  119 lines

  1. /*
  2.  * Initialize a daemon process.
  3.  */
  4.  
  5. #include    <stdio.h>
  6. #include    <signal.h>
  7. #include    <sys/param.h>
  8. #include    <errno.h>
  9. #include    <unistd.h>
  10. #include    <sys/file.h>
  11. #include    <sys/ioctl.h>
  12. #include    <sys/stat.h>
  13.  
  14. extern int    errno;
  15. extern void err_sys(char *fmt, ...);
  16.  
  17. /*
  18.  * Detach a daemon process from login session context.
  19.  */
  20.  
  21. void
  22. daemon_start(int ignsigcld)
  23.                      /* nonzero -> handle SIGCLDs so zombies don't clog */
  24. {
  25.   register int    childpid, fd;
  26.   
  27.       /*
  28.        * If we were started by init (process 1) from the /etc/inittab file
  29.        * there's no need to detach.
  30.        * This test is unreliable due to an unavoidable ambiguity
  31.        * if the process is started by some other process and orphaned
  32.        * (i.e., if the parent process terminates before we are started).
  33.        */
  34.   
  35.   if (getppid() == 1)
  36.     goto out;
  37.   
  38.       /*
  39.        * Ignore the terminal stop signals (BSD).
  40.        */
  41.   
  42. #ifdef SIGTTOU
  43.   signal(SIGTTOU, SIG_IGN);
  44. #endif
  45. #ifdef SIGTTIN
  46.   signal(SIGTTIN, SIG_IGN);
  47. #endif
  48. #ifdef SIGTSTP
  49.   signal(SIGTSTP, SIG_IGN);
  50. #endif
  51.   
  52.       /*
  53.        * If we were not started in the background, fork and
  54.        * let the parent exit.  This also guarantees the first child
  55.        * is not a process group leader.
  56.        */
  57.   
  58.   if ( (childpid = fork()) < 0)
  59.     err_sys("can't fork first child");
  60.   else if (childpid > 0)
  61.     exit(0);    /* parent */
  62.   
  63.       /*
  64.        * First child process.
  65.        *
  66.        * Disassociate from controlling terminal and process group.
  67.        * Ensure the process can't reacquire a new controlling terminal.
  68.        */
  69.   
  70.   if (setpgid(0, getpid()) == -1)
  71.     err_sys("can't change process group");
  72.   
  73.   signal(SIGHUP, SIG_IGN);    /* immune from pgrp leader death */
  74.   
  75.   if ( (childpid = fork()) < 0)
  76.     err_sys("can't fork second child");
  77.   else if (childpid > 0)
  78.     exit(0);    /* first child */
  79.   
  80.       /* second child */
  81.   
  82.   out:
  83.       /*
  84.        * Close any open files descriptors.
  85.        */
  86.   
  87.   for (fd = 0; fd < NOFILE; fd++)
  88.     close(fd);
  89.   
  90.   errno = 0;        /* probably got set to EBADF from a close */
  91.   
  92.       /*
  93.        * Move the current directory to root, to make sure we
  94.        * aren't on a mounted filesystem.
  95.        */
  96.   
  97.   chdir("/");
  98.   
  99.       /*
  100.        * Clear any inherited file mode creation mask.
  101.        */
  102.   
  103.   umask(0);
  104.   
  105.       /*
  106.        * See if the caller isn't interested in the exit status of its
  107.        * children, and doesn't want to have them become zombies and
  108.        * clog up the system.
  109.        * With System V all we need do is ignore the signal.
  110.        * With BSD, however, we have to catch each signal
  111.        * and execute the wait3() system call.
  112.        */
  113.   
  114.   if (ignsigcld)
  115.     {
  116.       signal(SIGCLD, SIG_IGN);    /* System V */
  117.     }
  118. }
  119.