1. 进程组

在这里插入图片描述

在这里插入图片描述

1. 可以看到这里不要管sleep 180,其它三个sleep的ppid一样,证明它们是兄弟进程

PGID是进程组,进程是以进程组的形式,完成对应的任务的,单个进程自己独立成为进程组
进程组是用来完成任务(作业)

进程组PGID是组长的pid,组长就是第一个创建的进程,这里就是sleep 1000
进程组的PGID是一样的,都是以组长的pid命名,就算杀掉了组长进程,进程组也不会消失,只是消失了sleep 1000,除非全部kill

SID是会话,进程组一定属于某个会话,这里就是进程组里有三个进程,都属于一个会话,而这个会话的SID是349534,就是bash,也就是说用户创建的所有进程和系统一开始创建的bash进程在同一个会话
下图就是原理,一开始会话里只有一个bash进程组,后面创建的进程变多进程组也就多了

父子进程属于同一个进程组,这里的三个sleep进程也是属于同一个进程组,这也就是为什么之前ctrl+c或者其它方式发信号时,进程都会退出,因为发信号是给一个进程组内的所有进程全部发送信号,所以都退了

bash和我们创建的进程不在同一个进程组,是因为如果收到信号了,bash进程不会终止,命令行会一直存在,可以继续输入命令传给OS,如果在同一个进程组,命令行没了,也不能输入命令给操作系统了

从此以后,我们把进程叫做进程组或作业(任务)
在这里插入图片描述

登录xshell时,我们要登录,其实是在Linux系统内部创建一个登录进程,然后登录进程创建一个终端文件,并默认打开标准输出,标准输入,标准错误,然后再创建子进程bash,并且程序替换bash,子进程bash也可以看到这个终端文件,然后子进程bash再创建子进程也可以看到这个文件,所以我们运行的所有结果就被那个登录进程拿到了,然后xshell就可以与系统交互了
首先登录进程得先运行bash程序,然后才能拿到用户在系统里输入的结果,怎么运行,就是程序替换

进程组和任务(作业)的区别?
任务就是某种工作,需要进程组来完成,进程组和任务是一个硬币的两面
在这里插入图片描述

bg就是让后台任务到前台,这个在信号那里写过

在windows登录,就是建立会话的过程,当你输完密码时,windows就会加载桌面,linux的外壳是命令行,在命令行输入命令交给操作系统,windows的外壳就是桌面,在桌面双击就是在一个会话内部建立一个进程组

登录就是建立会话的过程,关闭终端,就是销毁会话的过程,可能会影响服务器的运行,所以服务器会受到用户登录和注销的影响,就像xshell一退就是销毁会话,但你写的服务器不会退,但是可能会被修改pid,ppid等,而真正的服务器不能收到任何用户登陆和注销的影响,以前windows电脑有注销,效果跟linux关闭xshell一样

所以新建一个会话,让服务器这个进程组到新建的这个会话里面,但一般是这个进程组只有一个进程,这个进程独占该进程组,我们把这个进程叫守护进程也叫精灵进程,此时关闭xshell,就不会影响服务器了
在这里插入图片描述

2. 创建会话

如何创建一个会话,让服务器进程成为独立会话内部的进程组(作业)
在这里插入图片描述
调用setsid这个系统调用就可以新建会话,哪个进程调用它就让那个进程称为新建会话的作业,但是调用进程不能是一个进程组的组长,我们称该进程为守护进程

如果调用进程原来是进程组组长,则会报错,为了避免这种情况,通常的使用的方法是先调用fork创建子进程,父进程终止,子进程继续执行,因为子进程会继承父进程的进程组ID,而进程ID则是新分配的,就不会出现错误的情况,所以守护进程也是孤儿进程的一种,

调用该接口之后:
1. 调用进程会变成新会话的会话首进程,此时,新会话中只有唯一的一个进程
2. 调用进程会变成进程组组长,新进程组ID就是当前调用进程ID

守护进程vs后台进程vs前台进程
后台进程和前台进程在同一个会话,前台进程可以获取标准输入,后台进程不行,守护进程也是后台进程的一种,不过守护进程在一个新的会话里,这个会话只有它一个进程

3. 让会话内的进程变成一个真正的守护进程

setsid只是创建一个新会话,把进程放进去,此时的进程其实并不算真正意义上的守护进程,因为一个真正的守护进程不需要从键盘输入,也不需要向显示器打印,所以我们系统提供了一个文件让我们可以实现一个真正的守护进程,然后把标准输入,标准输出,标准错误都重定向到这个文件,此时该进程才是一个真正的守护进程
在这里插入图片描述
在这里插入图片描述
系统提供了daemon这个函数,哪个进程调用它,哪个进程就变成守护进程
这个函数内部做的工作,就是我下面写的红色字体

1. nochdir如果设为0,则表示把该进程的路径变成 / 根目录,否则不做任何改变
2. noclose如果设为0,表示该进程会关闭文件描述符 0,1,2,否则不做任何改变

一个守护进程
1. 先setsid使服务器进程在一个新建的会话中,该会话一般只有服务器进程自己,独占进程组,独占会话
2. 让该服务器进程的标准输入,标准输出,标准错误,重定向到/dev/null这个文件
此时这个进程就是守护进程了

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐