守护进程的创建
1.创建子进程,父进程退出;
fork(); //创建子进程
exit(); //结束父进程
*完成这一步, 子进程在形式上就与控制终端console脱离;
子进程称为”孤儿”;*
2.在子进程中创建新会话;
setsid(); //创建一个新的会话,并担任该会话的组长,目的是为了完全独立
完全脱离其他进程的控制;
3.改变当前目录为根目录;
chdir("/"); //程序运行过程中,所在目录不能卸载,但是当要进入单用户模式时,则会有很多麻烦,为了避免这些问题,让“/”作为当前目录是可以的。
4.重设文件权限掩码umask;
umask(0); //使用fork创建的进程继承了父进程的文件权限掩码,可能不符合守护进程的灵活性要求,因此重新设置umask为零,是合适的。
5.关闭文件描述符;
close(fd); //关闭从父进程继承的打开的文件,释放占用的内存资源
示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
int main()
{
pid_t pid;
int i, fd;
char *buf = "This is a Daemon.\n";
pid = fork();
if(pid<0)
{
perror("fork");
exit(EXIT_FAILURE);
}
else if(pid > 0)
{
exit(0); //父进程退出
}
/*子进程*/
//第二步,创建新会话
setsid();
//第三步,更改目录
chdir("/");
//第四步,更改umask
umask(0);
//第五步,关闭不必要文件描述符
for(int i=0; i< getdtablesize();i++)
{
close(i);
}
/*********至此,守护进程创建完毕,接下来进入守护进程********/
while(1)
{
if((fd= open(daemon.log)))
}
}