Linux守护进程
#include
#include
#include
#include
#include
#include
#include
#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毫秒
? ? }
}
守护进程,后台运行,不受终端影响。
每个从终端运行的进程,都依附于这个终端。这个终端就成为这些进程的控制终端。当控制终端被关闭时,相应的进程都会随之自动关闭。