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