步骤:
1.设置创建文件屏蔽字 <控制新建文件权限>
2.fork产生孤儿进程 <保证不会是组长进程 确保setsid成功调用>
3.调用setsid脱离控制终端 <脱离控制终端>//建立一个新会话
4.更改工作路径到'/' <防止意外的占用挂载路径 导致无法正常卸载>
5.关闭不用的文件描述符 并将 stdin stdout stderr 重定向到/dev/null
注:只有第三项是必须的,其他的可以根据用户实际需求写
产生守护进程的函数:
int daemon(int nochdir, int noclose);
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <time.h>
#include <string.h>
int caretDeamon(void);
int main(void)
{
int ret;
ret=caretDeamon();
if(ret!=0) return 1;
int fin;
fin=open("/tmp/date.txt",O_RDWR|O_TRUNC|O_CREAT,0644);
//做事情
time_t t;
struct tm *tt;
char *date;
while(1)
{
t=time(NULL);
tt=localtime(&t);
date=asctime(tt);
write(fin,date,strlen(date));
sleep(10);
}
return 0;
}
int caretDeamon(void)
{
pid_t pid;
//产生孤儿进程 避免其为组长进程
pid=fork();
if(pid==-1) return -1;
else if(pid>0) exit(0);//
//child process
umask(0077);//非必须选项
//printf("pid:%d gid:%d sid:%d
",getpid(),getpgrp(),getsid(getpid()));
if(setsid()==-1)//脱离控制终端进入后台
{
perror("setsid");
return -2;
}
//printf("pid:%d gid:%d sid:%d
",getpid(),getpgrp(),getsid(getpid()));
//如果无需和用户通过stdin stdout交互 则重定向
int fd;
fd=open("/dev/null",O_RDWR);
if(fd==-1) return -3;
dup2(fd,STDIN_FILENO);
dup2(fd,STDOUT_FILENO);
dup2(fd,STDERR_FILENO);
return 0;
}