目录
背景知识
守护进程
什么是守护进程
如何成为守护进程
如何使用守护进程
背景知识
- 前台进程
和终端关联的进程,叫做前台进程。
Linux下,默认前台进程是bash。一般来说,前台进程能正常获取用户的输入,并对输入做处理,例如我们输入ls,便会显示当前文件夹下的所有文件。
但是当我们运行服务器server时,此时只有服务器可以接收我的正常输入,bash接收不到也无法作出响应了,此时server便成了前台进程,bash便不再是了。
- 任何xshell登录,只允许有一个前台进程和多个后台进程.
- 进程除了有自己的pid,ppid还有一个组id(PGID).
- 在命令行中,同时用管道启用多个进程,多个进程是兄弟关系,父进程都是bash --->所以可以用匿名管道进行通信.
可以看到三个通过管道的进程,ppid都是bash.
- 同时被创建的多个进程可以成为一个进程组,组长一般是第一个进程。
还是上面那张图,三个进程的PGID都和第一个一致.
- 任何一次登陆,登录的用户,需要有多个进程(组)来为用户服务的.用户自己可以启动很多进程,或进程组,我们把给用户提供服务的进程或者用户自己所启动的所有的进程或服务,整体是要属于一个叫做会话的机制中的.
- SID(Session ID)是一个与进程相关的标识符,用于识别进程所属的会话。每个会话可以包含多个进程,而会话的创建是由终端或登录会话触发的。
例如,我们再启动一个终端,同样执行sleep:
它们的SID是不同的,说明会话也是不同的.
守护进程
什么是守护进程
守护进程(Daemon process)是在操作系统中以一种特殊的方式运行的后台进程。它在系统启动时被启动,并持续运行,独立于任何用户会话。守护进程通常不与终端或控制台交互,它在后台默默地执行特定的任务或提供某种服务。
在linux下,当我们登录时,会自动为我们创建一个会话,然后启用多个为用户提供服务的进程,例如bash等,它们自成一个进程组。
然后就是用户自己创建进程或进程组等操作。如下图:
那么如果一个进程独立于这个会话外,然后自成一个会话,此时这个进程叫做守护进程。
如何成为守护进程
那么一个进程如何自称一个会话,成为守护进程呢,这里需要用到setsid()函数。
该函数原型如下:
pid_t setsid(void);
该函数会将调用该函数的进程 变为守护进程。但是该进程不能是进程组的组长。
就好比你在一家公司是一个项目的组长,手下有很多组员,掌握着很多项目相关的东西。假设一天你要离职,老板也不会同意,你走了那些成员怎么办呢,谁来管理那些项目呢,所以不能能离职。那如果只是一个组员,一个员工,要去离职,便没有什么顾虑了,一般可以成功。
返回值
成功会返回该进程程成为会话的SID,失败的话返回-1并且错误码被设置。
如何使用守护进程
这是使用的整体流程:
1.忽略信号.SIGPIPE,SIGCHLD(具体原因上一章有说明)
2.不要让自己成为组长.(创建子进程,使子进程来变成守护进程)
3.子进程调用setsid.
4.将标准输入,标准输出,标准错误重定向,守护进程不能直接向显示器中打印信息.(可以重定向到/dev/null,该文件是一个特殊的设备文件,它丢弃一切写入其中的数据,读取它则会立即得到一个EOF。又称作“黑洞文件”).
代码如下:
#pragma once
#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
using namespace std;
void myDaemon()
{
//1.忽略信号,SIGPIPE,SIGCHLD
signal(SIGPIPE,SIG_IGN);
signal(SIGCHLD,SIG_IGN);
//2.不要让自己成为组长,让父进程直接退出,子进程继续执行
if(fork() < 0) exit(0);
//3.调用setsid
setsid();
//4.标准输入,标准输出,标准错误的重定向,守护进程不能直接想显示器中打印信息
int devnull = open("/dev/null",O_RDONLY,O_WRONLY);
if(devnull > 0)
{
dup2(0,devnull);
dup2(1,devnull);
dup2(2,devnull);
close(devnull);
}
}
然后我们添加在服务器开始代码之前:
这样就完成了守护进程的基本使用了.我们来看看效果:
我们发现,此时再运行服务器端便不再向以前那样卡着等待客户端的链接和请求了,而是直接自己独立成为了一个会话,此时我们再利用客户端链接:
发现依然可以正常链接且提供正常的服务。这便是守护进程的好处。文章来源:https://www.toymoban.com/news/detail-683368.html
至此守护进程的讲解完成了。 文章来源地址https://www.toymoban.com/news/detail-683368.html
到了这里,关于【Linux】守护进程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!