什么是守护进程
守护进程也称精灵进程(Daemon),是运⾏在后台的⼀种特殊进程。它独⽴于控制终端并且周期性地执⾏某种任务或等待处理某些发⽣的事件。守护进程是⼀种很有⽤的进程。 Linux的⼤多数服务器就是⽤守护进程实现的。⽐如, ftp服务器, ssh服务器, Web服务器httpd等。同时,守护进程完成许多系统任务。⽐如,作业规划进程crond等。
Linux系统启动时会启动很多系统服务进程,这些系统服务进程没有控制终端,不能直接和⽤户交互。其它进程都是在⽤户登录或运⾏程序时创建,在运⾏结束或⽤户注销时终⽌,但系统服务进程(守护进程)不受⽤户登录注销的影响,它们⼀直在运⾏着。这种进程有⼀个名称叫守护进程(Daemon)。
守护进程有如下几个特点:
- 独立于控制终端,不与任何终端建立联系
- 不受用户的登陆注销的影响
- 运行在后台
守护进程的“进化史”
在这里插入图片描述
代码实现
//守护进程进化史:
//1.创建一个孤儿进程
//2.在孤儿进程内创建一个新会话
//3.修改默认工作路径为"/"
//4.重定向文件描述符到"/dev/null"
//5.设置文件的默认权限掩码
//6.确保自身不是会话首进程,从而不和任何终端建立联系
//7,成功逆袭成为守护进程
#include<iostream>
#include<unistd.h>
#include<stdlib.h>
#include<error.h>
#include<fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
void MyDaemon()
{
int pid = fork();
if (pid < 0)
{
exit(-1);
}
else if (pid > 0)
{
exit(0);
}
//创建孤儿进程完成
int sid = setsid();
if (sid < 0)
{
exit(-1);
}
//创建会话完成
chdir("/");//修改默认工作路径
int fd = open("/dev/null",O_RDWR);
dup2(fd,0);
dup2(fd,1);
dup2(fd,2);//文件描述符重定向
umask(0);//修改默认权限
pid = fork();
if (pid < 0)
{
exit(-1);
}
else if (pid > 0)
{
exit(0);
}
//创建孙子进程,孙子进程不是该会话的首进程(受进程是刚才退出的孤儿进程,)。
//这样做能保证该进程不和任何终端建立联系。
}//创建成功
int main()
{
MyDaemon();
while(1)
{
sleep(1);
}
return 0;
}
⽤ps axj命令查看系统中的进程。参数a表⽰不仅列当前⽤户的进程,也列出所有其他⽤ 户的进程,参
数x表⽰不仅列有控制终端的进程,也列出所有⽆控制终端的进程,参数j表⽰列出与 作业控制相关的信息。
测试结果:
其中PPID等于1说明他是一个孤儿进程,TTY 等于 ?说明不与任何任何终端有联系。
当然创建守护进程也可以调用deamon函数:
#include <unistd.h>
int daemon(int nochdir, int noclose);
参数:
nochdir: 为0则修改默认工作路径
noclose:为0则重定向文件描述符