#include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #include<fcntl.h> #include<sys/types.h> #include<sys/wait.h> #define MAXFILE 65535 volatile sig_atomic_t _running = 1; void sigterm_handler(int arg) { _running = 0; } int main() { pid_t pc, pid; int i, fd, len, flag = 1; char *buf = "this is a Dameon\n"; len = strlen(buf); //第一步,创建子进程,结束父进程,让init进程收养 pc = fork(); if (pc < 0) { printf("error fork\n"); exit(1); } else if (pc > 0) { exit(0); } //第二步,创建新会话,setsid(set session id),摆脱原会话的控制,摆脱原进程组的控制,摆脱原控制终端的控制 pid = setsid(); if (pid < 0) perror("setsid error"); //第三步,更改工作目录 chdir("/"); //第四步,重设文件权限掩码 umask(0); //第五步,关闭文件描述符 for (i = 0; i < MAXFILE; i++) close(i); signal(SIGTERM, sigterm_handler); while (_running) { if (flag ==1 && (fd=open("/tmp/daemon.log", O_CREAT|O_WRONLY|O_APPEND, 0600))<0) { perror("open"); flag = 0; exit(1); } write(fd,buf,len); close(fd); usleep(10*1000); //10毫秒 } }
守护进程,后台运行,不受终端影响。
每个从终端运行的进程,都依附于这个终端。这个终端就成为这些进程的控制终端。当控制终端被关闭时,相应的进程都会随之自动关闭。
补充:
在程序中调用daemon()函数即可称为守护进程,更加方便。
#include <stdio.h> #include <unistd.h> int main() { FILE *fp; unsigned long count = 0; daemon(0, 0); fp = fopen("/tmp/daemon.log", "a+"); if (!fp) { return -1; } while (1) { fprintf(fp, "count %lu\n", count++); fflush(fp); sleep(10); } fclose(fp); return 0; }
来源:https://www.cnblogs.com/yilipika/p/4791613.html