home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / files / telecomm / nhclb120 / daemon.c < prev    next >
C/C++ Source or Header  |  1993-09-26  |  965b  |  61 lines

  1. /*    Detach a daemon process from login session context */
  2.  
  3. #include <signal.h>
  4. #include <stdio.h>
  5.  
  6. #if    (defined(SUNOS4) || defined(BSD))
  7. #include <sys/param.h>
  8. #define    _NFILE NOFILE
  9. #endif
  10. #ifndef _NFILE
  11. #define _NFILE 20
  12. #endif
  13.  
  14. #ifdef    SYSV
  15. extern void exit();
  16. #else
  17. extern int exit();
  18. #endif
  19.  
  20. void
  21. daemon()
  22. {
  23.     int fd;
  24.     FILE *fp;            /* pointer to current descriptor */    
  25.  
  26.     /* if started by init there's no need to detach */
  27.  
  28.     if (getppid() == 1)
  29.         goto out;
  30.  
  31.     /* ensure process is not a process group leader */
  32.  
  33.     if (fork() != 0)
  34.         exit(0);    /* parent */
  35.  
  36.     /* child */
  37.  
  38.     (void)setpgrp();        /* lose ctrl term, chg proc grp */
  39.  
  40.     (void)signal(SIGHUP, SIG_IGN);    /* immune from pgrp death */
  41.  
  42.     if (fork() != 0)    /* become non pgrp leader */
  43.         exit(0);    /* first child */
  44.  
  45.     /* close all file descriptors */
  46.  
  47. out:
  48.  
  49.     _cleanup();
  50.  
  51.     for (fd = 0; fd < _NFILE; fd++) {
  52.         (void)close(fd);
  53.     }
  54.  
  55. /*    (void)chdir("/");        /* move off any mounted file system */
  56.  
  57.     (void)umask(0);
  58.  
  59.     return;
  60. }
  61.