Advertisement
Guest User

Untitled

a guest
Feb 23rd, 2020
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.92 KB | None | 0 0
  1. /*#include <stdio.h>
  2. #include <unistd.h>
  3. #include <syslog.h>
  4. #include <sys/stat.h>
  5. #include <signal.h>
  6. #include <string.h>
  7. #include <errno.h>
  8.  
  9. #include "./include/apue.h"
  10. #include <syslog.h>
  11. #include <fcntl.h>
  12. #include <sys/resource.h>
  13. */
  14.  
  15. #include <syslog.h>
  16. #include <stdlib.h>
  17. #include <fcntl.h>
  18. #include <sys/resource.h>
  19. #include <sys/stat.h> //umask
  20. #include <unistd.h> //setsid
  21. #include <stdio.h> //perror
  22. #include <signal.h> //sidaction
  23. #include <string.h>
  24. #include <errno.h>
  25. #include <sys/file.h>
  26. #include <time.h>
  27.  
  28. #define LOCKFILE "/var/run/daemon.pid"
  29. #define LOCKMODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)
  30.  
  31. int already_running(void)
  32. {
  33.     int fd;
  34.     char buf[16];
  35.  
  36.     fd = open(LOCKFILE, O_RDWR | O_CREAT, LOCKMODE);
  37.  
  38.     if (fd < 0){
  39.         syslog(LOG_ERR, "невозможно открыть %s: %s",
  40.         LOCKFILE, strerror(errno));
  41.         exit(1);
  42.     }
  43.  
  44.     if (lockfile(fd) < 0){
  45.         if (errno = EACCES || errno == EAGAIN){
  46.             close(fd);
  47.             return 1;
  48.         }
  49.         syslog(LOG_ERR, "невозможно установить блокировку на %s: %s",
  50.         LOCKFILE, strerror(errno));
  51.         exit(1);
  52.     }
  53.    
  54.     ftruncate(fd, 0);
  55.     sprintf(buf, "%ld", (long)getpid());
  56.     write(fd, buf, strlen(buf)+1);
  57.     return 0;
  58. }
  59.  
  60.  
  61. void daemonize(const char *cmd)
  62. {
  63.     int i, fd0, fd1, fd2;
  64.     pid_t pid;
  65.     struct rlimit rl;
  66.     struct sigaction sa;
  67.    
  68.     // Сбросить маску режима создания файла
  69.     umask(0);
  70.  
  71.     // Получить максимально возможный номер дескриптора файла
  72.     if (getrlimit(RLIMIT_NOFILE, &rl) < 0)
  73.         perror("Невозможно получить максимальный номер дескриптора ");    
  74.  
  75.     // Стать лидером нового сеанса, чтобы утратить управляющий терминал
  76.     if ((pid == fork) < 0)
  77.         perror("Ошибка вызова функции fork");
  78.     else if (pid != 0)
  79.         exit(0);
  80.    
  81.     setsid();
  82.  
  83.     // Обеспечить невозможность обретения управляющего терминала в будущем
  84.     sa.sa_handler = SIG_IGN;
  85.     sigemptyset(&sa.sa_mask);
  86.     sa.sa_flags = 0;
  87.     if (sigaction(SIGHUP, &sa, NULL) < 0)
  88.         perror("Невозможно игнорировать сигнал SIGHUP");
  89.     if ((pid = fork()) < 0)
  90.         perror("Ошибка вызова функции fork");
  91.     else if (pid != 0) /* родительский процесс */
  92.         exit(0);
  93.  
  94.     // Назначить корневой каталог текущим рабочим каталогом,
  95.     // чтобы впоследствии можно было отмонтировать файловую систему
  96.     if (chdir("/") < 0)
  97.         perror("Невозможно сделать текущим рабочим каталогом /");
  98.    
  99.     // Закрыть все открытые файловые дескрипторы.
  100.     if (rl.rlim_max == RLIM_INFINITY)
  101.         rl.rlim_max = 1024;
  102.     for (i = 0; i < rl.rlim_max; i++)
  103.         close(i);
  104.  
  105.     // Присоединить файловые дескрипторы 0, 1 и 2 к /dev/null.
  106.     fd0 = open("/dev/null", O_RDWR);
  107.     fd1 = dup(0);
  108.     fd2 = dup(0);
  109.  
  110.     // Инициализировать файл журнала.
  111.     openlog(cmd, LOG_CONS, LOG_DAEMON);
  112.     if (fd0 != 0 || fd1 != 1 || fd2 != 2) {
  113.         syslog(LOG_ERR, "Ошибочные файловые дескрипторы %d %d %d",
  114.         fd0, fd1, fd2);
  115.         exit(1);
  116.     }
  117.  
  118.     long int ttime;
  119.     ttime = time(NULL);
  120.  
  121.     syslog("%s", ctime(&ttime));
  122. }
  123.  
  124. int main(void)
  125. {
  126.     daemonize("user_demon");
  127.     if (already_running() != 0)
  128.     {
  129.         syslog(LOG_ERR, "Демон уже запущен.");
  130.         exit(1);
  131.     }
  132. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement