Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdlib.h>
- #include <signal.h>
- #include <stdio.h>
- #define DAEMON_NAME "polld"
- #define RUN_AS_USER "rps"
- #define LOCK_FILE "/var/lock/polld"
- #define WORKING_DIR "/tmp"
- #define LOG_FILE "/var/log/polld"
- #define INTERVAL 1
- #define TRUE 1
- #define FALSE 0
- int running;
- void daemonize();
- void catch_SIGUSR1();
- void catch_SIGTERM();
- void catch_SIGALRM();
- void execute();
- int
- main(int argc, char* argv[])
- {
- daemonize();
- running = TRUE;
- signal(SIGTERM, catch_SIGTERM);
- signal(SIGALRM, catch_SIGALRM);
- while (running)
- {
- alarm(INTERVAL);
- pause();
- }
- signal(SIGTERM, SIG_DFL);
- signal(SIGALRM, SIG_DFL);
- exit(EXIT_SUCCESS);
- }
- void
- daemonize()
- {
- pid_t pid;
- pid_t sid;
- pid_t parrent;
- FILE* fp;
- if (getppid() == 1)
- return;
- if (fp = fopen(LOCK_FILE, "r"))
- {
- fclose(fp);
- fprintf(stderr, "Daemon is already running.\n\n");
- exit(EXIT_FAILURE);
- }
- else
- {
- fp = fopen(LOCK_FILE, "w");
- }
- signal(SIGUSR1, catch_SIGUSR1);
- pid = fork();
- if (pid < 0)
- {
- fprintf(stderr, "Starting daemon failed (unable to fork child process).\n\n");
- exit(EXIT_FAILURE);
- }
- else if (pid > 0)
- {
- alarm(10);
- pause();
- fprintf(stderr, "Starting daemon failed (child process did not kill parrent).\n\n");
- exit(EXIT_SUCCESS);
- }
- fprintf(fp, "%d\n", getpid());
- fclose(fp);
- parrent = getppid();
- signal(SIGCHLD, SIG_DFL);
- signal(SIGTSTP, SIG_IGN);
- signal(SIGTTOU, SIG_IGN);
- signal(SIGTTIN, SIG_IGN);
- signal(SIGHUP, SIG_IGN);
- signal(SIGTERM, SIG_DFL);
- umask(0);
- sid = setsid();
- if (sid < 0)
- {
- fprintf(stderr, "Starting daemon failed (unable to establish new session).\n\n");
- exit(EXIT_FAILURE);
- }
- if ((chdir(WORKING_DIR)) < 0)
- {
- fprintf(stderr, "Error: Unable to change to working directory.\n\n");
- exit(EXIT_FAILURE);
- }
- freopen("/dev/null", "r", stdin);
- freopen(LOG_FILE, "a+", stdout);
- freopen(LOG_FILE, "a+", stderr);
- kill(parrent, SIGUSR1);
- }
- void
- catch_SIGUSR1()
- {
- exit(EXIT_SUCCESS);
- }
- void
- catch_SIGTERM()
- {
- running = FALSE;
- unlink(LOCK_FILE);
- }
- void
- catch_SIGALRM()
- {
- pid_t pid;
- pid = fork();
- if (pid == 0)
- {
- execute();
- exit(EXIT_SUCCESS);
- }
- else {
- wait();
- }
- }
- void
- execute()
- {
- printf("Testing.\n");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement