linux守護進程樣本程式

來源:互聯網
上載者:User

#include <stdio.h><br />#include <fcntl.h><br />#include <stdlib.h><br />#include <unistd.h><br />#include <pwd.h><br />#include <time.h><br />#include <signal.h></p><p>int daemon(int, int);<br />char *daemon_log = "/u01/log/daemon.log";<br />int add_log(char*, char*);<br />void sig_handler(int);<br />void restart_sleep(int);<br />int is_daemon = 1;<br />int is_root = 1;</p><p>int main()<br />{<br />fprintf(stdout, "daemon start/n");<br />int ret;<br />//是否切換到普通使用者<br />if (!is_root) {<br />if (getuid() == 0 || geteuid() == 0) {<br />char *username = "flynetcn";<br />struct passwd *pw;<br />if ((pw = getpwnam(username)) == 0) {<br />fprintf(stderr, "can't find the user %s/n", username);<br />return 1;<br />}<br />if (setgid(pw->pw_gid) < 0 || setuid(pw->pw_uid) < 0) {<br />fprintf(stderr, "failed to assume identity of user %s/n", username);<br />return 1;<br />}<br />}<br />}<br />//防止僵死子進程<br />struct sigaction sa, oldsa;<br />sa.sa_handler = sig_handler;<br />sigemptyset(&sa.sa_mask);<br />sa.sa_flags = SA_RESTART;<br />if (sigaction(SIGCHLD, &sa, &oldsa) == -1) {<br />fprintf(stderr, "sigaction(SIGCHLD) error/n");<br />return 1;<br />}<br />//切換到守護進程<br />if (is_daemon) {<br />ret = daemon(1, 0);<br />if (ret == -1) {<br />fprintf(stderr, "failed to daemon/n");<br />return 1;<br />}<br />}</p><p>/**<br /> * do something<br /> */<br />int crontimers[3][2];<br />//task 1<br />crontimers[0][0] = 3;<br />crontimers[0][1] = 6;<br />//task 2<br />crontimers[1][0] = -1;<br />crontimers[1][1] = 6;<br />//task 3<br />crontimers[2][0] = -1;<br />crontimers[2][1] = 36;<br />//tasks comm<br />char *croncomm[3];<br />croncomm[0] = "echo task1 >> /dev/null 2>&1";<br />croncomm[1] = "echo task2 >> /dev/null 2>&1";<br />croncomm[2] = "echo task3 >> /dev/null 2>&1";<br />char buf[1024];<br />char tbuf[50];<br />time_t timestamp;<br />struct tm *now;<br />int time_left;<br />int cron_num;<br />cron_num = sizeof(croncomm)/sizeof(char*);<br />int hok, i;<br />while (1) {<br />timestamp = time(NULL);<br />now = localtime(&timestamp);<br />strftime(tbuf, 30, "%Y-%m-%d %H:%M:%S", now);<br />//<br />sprintf(buf, "%s ------/n", tbuf);<br />add_log(buf, daemon_log);<br />for (i=0; i<cron_num; i++) {<br />hok=0;<br />sprintf(buf, "task %d :/n", i);<br />add_log(buf, daemon_log);<br />if (crontimers[i][0]==-1 || now->tm_hour==crontimers[i][0]) {<br />hok = 1;<br />add_log("hok/n", daemon_log);<br />} else {<br />continue;<br />}<br />if (crontimers[i][1]==now->tm_min && croncomm[i]) {<br />add_log("mok/n", daemon_log);<br />sprintf(buf, "run %s/n", croncomm[i]);<br />add_log(buf, daemon_log);<br />ret = fork();<br />if (ret == 0) {<br />system(croncomm[i]);<br />exit(0);<br />}<br />}<br />}<br />timestamp = time(NULL);<br />now = localtime(&timestamp);<br />time_left = 60 - now->tm_sec;<br />restart_sleep(time_left);<br />}<br />/**<br /> * end<br /> */</p><p>}</p><p>int add_log(char *str, char *logfile)<br />{<br />FILE *fp;<br />if ((fp = fopen(logfile, "a")) == NULL) {<br />return -1;<br />}<br />if (!(*str) || fputs(str, fp)==EOF) {<br />fclose(fp);<br />return -1;<br />}<br />fflush(fp);<br />fclose(fp);<br />return 0;<br />}</p><p>int daemon(int nochdir, int noclose)<br />{<br />int fd, ret;<br />ret = fork();<br />switch (ret) {<br />case -1: return -1;<br />case 0: break;<br />default: exit(0);<br />}<br />if (setsid() == -1)<br />return -1;<br />if (nochdir == 0) {<br />if(chdir("/") != 0) {<br />perror("chdir");<br />return -1;<br />}<br />}<br />if (noclose == 0 && (fd = open("/dev/null", O_RDWR, 0)) != -1) {<br />if(dup2(fd, STDIN_FILENO) < 0) {<br />perror("dup2 stdin");<br />return -1;<br />}<br />if(dup2(fd, STDOUT_FILENO) < 0) {<br />perror("dup2 stdout");<br />return -1;<br />}<br />if(dup2(fd, STDERR_FILENO) < 0) {<br />perror("dup2 stderr");<br />return -1;<br />}<br />if (fd > STDERR_FILENO) {<br />if(close(fd) < 0) {<br />perror("close");<br />return -1;<br />}<br />}<br />}<br />return 0;<br />}</p><p>void sig_handler(int sig)<br />{<br />if (sig == SIGCHLD) {<br />int status;<br />pid_t pid;<br />pid = wait(&status);<br />}<br />}<br />//防止被訊號中斷<br />void restart_sleep(int sec)<br />{<br /> int left;<br /> left = sec;<br /> while (left > 0) {<br /> left = sleep(left);<br /> }<br />}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.