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一样

相关推荐
西西弗Sisyphus13 分钟前
理解 Linux 动态库加载:LD_LIBRARY_PATH
linux
AR-26710-14 分钟前
Linux Day31——实操启停服务改端口重启
linux·运维
QZ1665609515943 分钟前
政务泛监测体系能力排行:AI 重塑监测边界,治理的颗粒度革命
网络·人工智能·安全·网络安全·政务
叼烟扛炮1 小时前
Linux 学习笔记(五十八):IO 多路复用封神——epoll 底层原理揭秘
linux·运维·服务器·网络·笔记·学习·php
叼烟扛炮1 小时前
Linux 学习笔记(五十一):数据链路层与 ARP 协议——局域网寻址与黑客骗局
linux·网络·网络协议·php·tcpdump
星恒随风2 小时前
Linux网络编程:彻底理解IO多路复用select!从fd_set位图、读写就绪到手写TCP多客户端字典服务器
linux·服务器·网络
陈布衣2 小时前
MySQL(1)_MySQL 5.7.21 Linux 安装笔记
linux·笔记·mysql
xyzzklk3 小时前
在Open-WebUI中提升向量化速度
网络·人工智能·爬虫·ai·语言模型·自然语言处理·安卓
Oiiouui4 小时前
linux服务器部署Logto后端与对应前端的实现
linux·服务器·前端·后端
ITKEY_5 小时前
用 Emacs Dired 实现 em:退出文件管理器后,让终端自动切换目录
linux·服务器·emacs