在linux下的一种特殊进程称为守护进程,其作用是在后台默默提供服务的,随系统结束而结束,或者是kill -9 的信号结束
daemon,表示守护进程,简称为d(进程名后面带d的基本就是守护进程)
ps -aux
命令得到的程序中在tty 一栏中为?的皆为守护进程,说明不隶属于任何的控制台的程序。
一般我们在终端中执行的程序其父进程都是bash ,子进程在bash结束后,会被回收
实现守护进程有以下的几个步
- 子进程等待父进程退出
- 子进程使用setsid创建新的会话期,脱离控制台
- 调用chdir将当前工作目录设置为/
- umask设置为0以取消任何文件权限屏蔽
- 关闭所有文件描述符
- 将0、1、2定位到/dev/null
- 通过在父进程中执行 exit() 先于子进程退出
这样子进程的父进程就自动的切换为了init - chdir(“/”); 切换工作目录为根目录
- umask();
- close();所有的打开的文件描述符
- open(/dev/null)连续三次,使得STDIN,STDOUT,STDERR,都对应的是/dev/null也算是系统的垃圾桶
- 这样就可以实现一个守护进程
下面是实现的代码demo:
void deamon_creator(char *cmd)
{
pid_t pid;
int i;
int fd0, fd1, fd2;
if ( (pid = fork()) < 0){
printf("fork failed\n");
return;
}
else if (pid > 0){ //the parent process terminate!
exit(0);
}
if (setsid() < 0){ //set the sid
printf("setsid failed\n");
return;
}
for (i = 0; i < sysconf(OPEN_MAX); i++){ //get the num of max_opened
close(i);
}
if (chdir("/") < 0){
printf("chdir failed\n");
return;
}
umask(0); //set the mask
fd0 = open("dev/null", O_RDWR);
fd1 = dup(0);
fd2 = dup(0); //copy the fd one by one
for(;;);
}