TCP socket api详解 续

文章目录

退出的时候呢?

会话有很多后台任务,bash肯定会退,那后台会话怎么办呢?

理论上也要退的,但实际上关了bash,bash肯定要退,所有进程的父进程都是bash他就自动托孤,但他们依旧属于同一个会话,所以后台会话还是在系统里被保留下来了,他是没有问题的依旧可以跑的。这写后台进程收到了用户登录和退出的影响的,因为ppid发生改变

图中后台进程关闭bash前后对比

如果我们今天不想受到任何用户登录和注销的影响---守护进程化

注销:Windows中也有类似会话,注销会把会话关闭,前后台会话都关闭,再重启就不卡了。

守护进程

我们要把后台进程转化为

自成进程组+自成会话的进程 --守护进程

所以和曾经打开的bash会话中从包含关系变成并列关系,此时你爱怎么样怎么样和我无关,不再受用户登录和注销的影响了。

怎么做到?

setsid

创建一个会话,谁调用这个setsid就把进程的组ID 设置为会话的id

相当于让一个进程独立成会话

返回值

成功返回新的会话ID,一般都是调用进程的pid,否则-1被返回

函数特点:你要创建新会话,调用进程不能是进程组的组长。

组长是多个进程中的第一个

但是组员可以

基本进程本身自己就是组成,自成进程组,也是组长。

那我们就没办法去调用setsid呢?

我怎么保证自己不是组长呢?

默认可执行程序启动就是组长,pid = pgid

换句话说只要我不是第一个进程,那我就一定不是组长啊。

所以创建守护进程最核心的一部就是fork,如果是父进程直接退出,子进程setsid就一定能成功了。

这其实就是守护进程最核心的点了。

所以守护进程的本质也是孤儿进程!

因为它的父进程直接就退了,所以守护进程立马要被系统领养,他唯一和孤儿进程不一样的是他很坚强,他把自己设置为独立的会话。就不受任何用户登录注销影响。

有些程序需要在根目录,所以有更改守护进程的路径选项

在初始化init ,启动的时候调用这个函数,进去的时候是父进程出去的时候就是子进程,以子进程的身份往后执行。

关键是后续代码有很多输出打印日志,还可能有标准输入,标准错误。

作为守护进程就不应该往显示器打印了。

所以需要关闭标准输入,标准输出,标准错误

那你往已经关闭的输出输出流打印,printf函数不都出错了吗,函数调用全都失败的。

我们决不允许出现这样的错误。

如果你能做到让日志往文件里写,那就和0,1,2就没关系,所以正常。

可是服务器里不用日志还有大量cout cerr 难道就看着他们出错吗,即便不出错,我写个守护进程还有把打印都删掉吗?

怎么样平滑的处理这个问题?

dev/null字符文件

相当于垃圾桶

写进这个文件的数据全部会被丢弃。

堵不如疏,不如将标准输入输出错误全部重定向至/dev/null

如果你想把日志保留,那就让日志往文件里面写。

守护进程没终端,也不会从键盘里面获取了。

谁规定守护进程打印信息必须从显示器上看,如果一个服务已经启动了,这个服务的错误消息不应该在显示器上读,因为他必须把自己的日志信息写到文件里。

打开这个dev/null 文件 把三个流重定向到这个文件中,这个文件后面也不用了就关了,因为文件描述符表已经重定向完成了。


ls /proc/pid -l 内存级进程可视化

ls /proc/4945/fd -l 这不文件描述符表吗哈哈,不过是内存级的所以会闪动,磁盘上没有对应的镜像文件,345是客户端来连我的

那守护进程怎么关呢,直接kill

为什么我们能用shell来访问云服务呢?

因为系统里默认有一个22号服务也就是ssh

shell向sshd -D发起请求,经过网络执行再把结果返回

一般进程如果是守护进程 名字应该以d结尾

难道要让我自己搞这个守护进程吗,有没有好点的做法,不要让我自己写,系统有没有默认的呢?

daemon

默认参数0,0就可以了,和我们的deamon一样

相关推荐
Fireworkitte14 分钟前
Ubuntu、CentOS、AlmaLinux 9.5的 rc.local实现 开机启动
linux·ubuntu·centos
sword devil9001 小时前
ubuntu常见问题汇总
linux·ubuntu
ac.char1 小时前
在CentOS系统中查询已删除但仍占用磁盘空间的文件
linux·运维·centos
淮北也生橘122 小时前
Linux的ALSA音频框架学习笔记
linux·笔记·学习
iナナ4 小时前
传输层协议——UDP和TCP
网络·网络协议·tcp/ip·udp
华强笔记6 小时前
Linux内存管理系统性总结
linux·运维·网络
十五年专注C++开发6 小时前
CMake进阶: CMake Modules---简化CMake配置的利器
linux·c++·windows·cmake·自动化构建
phoenix09817 小时前
ansible部署lnmp-allinone
linux·运维·ansible
winds~7 小时前
【git】 撤销revert一次commit中的某几个文件
linux·c++
iY_n8 小时前
Linux网络基础
linux·网络·arm开发