📄 1
字号:
/* Change this to the user under which to run */#define RUN_AS_USER "root"#define EXIT_SUCCESS 0#define EXIT_FAILURE 1#if 0static void child_handler(int signum){ switch(signum) { case SIGALRM: exit(EXIT_FAILURE); break; case SIGUSR1: exit(EXIT_SUCCESS); break; case SIGCHLD: exit(EXIT_FAILURE); break; }}static void daemonize(const char *lockfile){ pid_t pid, sid, parent; int lfp = -1; /* already a daemon */ if (getppid() == 1) return; /* Create the lock file as the current user */ if (lockfile && lockfile[0]) { lfp = open(lockfile,O_RDWR|O_CREAT,0640); if (lfp < 0) { printf("unable to create lock file %s, code=%d (%s)", lockfile, errno, strerror(errno)); exit(EXIT_FAILURE); } } /* Drop user if there is one, and we were run as root */ if ( getuid() == 0 || geteuid() == 0 ) { struct passwd *pw = getpwnam(RUN_AS_USER); if (pw) { printf("setting user to " RUN_AS_USER); setuid( pw->pw_uid ); } } /* Trap signals that we expect to recieve */ signal(SIGCHLD, child_handler); signal(SIGUSR1, child_handler); signal(SIGALRM, child_handler); /* Fork off the parent process */ pid = fork(); if (pid < 0) { printf("unable to fork daemon, code=%d (%s)", errno, strerror(errno) ); exit(EXIT_FAILURE); } /* If we got a good PID, then we can exit the parent process. */ if (pid > 0) { /* Wait for confirmation from the child via SIGTERM or SIGCHLD, or for two seconds to elapse (SIGALRM). pause() should not return. */ alarm(2); pause(); exit(EXIT_FAILURE); } /* At this point we are executing as the child process */ parent = getppid(); /* Cancel certain signals */ signal(SIGCHLD,SIG_DFL); /* A child process dies */ signal(SIGTSTP,SIG_IGN); /* Various TTY signals */ signal(SIGTTOU,SIG_IGN); signal(SIGTTIN,SIG_IGN); signal(SIGHUP, SIG_IGN); /* Ignore hangup signal */ signal(SIGTERM,SIG_DFL); /* Die on SIGTERM */ /* Change the file mode mask */ umask(0); /* Create a new SID for the child process */ sid = setsid(); if (sid < 0) { printf("unable to create a new session, code %d (%s)", errno, strerror(errno) ); exit(EXIT_FAILURE); } /* Change the current working directory. This prevents the current directory from being locked; hence not being able to remove it. */ if ((chdir("/")) < 0) { printf("unable to change directory to %s, code %d (%s)", "/", errno, strerror(errno) ); exit(EXIT_FAILURE); } /* Redirect standard files to /dev/null */ freopen("/dev/null", "r", stdin); freopen("/dev/null", "w", stdout); freopen("/dev/null", "w", stderr); /* Tell the parent process that we are A-okay */ kill( parent, SIGUSR1 );}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -