一切皆文件
我们知道在Linux
的世界里,一切皆文件。
而在前面的博客也说过,Linux
世界里对文件进行读写、或进行输入/输出,很好地模拟了图灵机模型,所以,它的描述能力是非常强的!
图例
- 常见文件
一切皆分形
在编程的世界里,有很多设计思想,如果从分形的角度来看,它们都可以将它们所形成的体系,看成分形系统。
在分形系统的世界,充满着自相似。例如,剪取树的任一部分,都与其它部分相似,自身也是一颗树!
文件分形
- 一切皆文件
注:以Linux
为代表
过程分形
- 一切皆过程
注: 以C
为代表
对象分形
- 一切皆对象
注:以C++\JAVA
为代表
函数分形
- 一切皆函数
注:以函数编程
为代表
递归分形
- 一切皆递归
注:以递归编程
为代表
如果以某一种设计思想,一以贯之进行搭建,抽象来看,就是一个完美的分形 😃
系统设计工具
- 流程图
- 状态图
- 序列图
- 泳道图
每种
UML
图例适合描述的设计思想是非常不同的,也可以看出来它们之间的本质不同,并不可混淆使用
观察进程树、文件链分形
工具链
- ps
- pstree
- lsof
观察
用
pstree -sp [$pid]
命令,可以观察Linux
世界形成的进程树分形。
在Linux
世界中,存在特别的0
号进程和1
号进程,以及2
号进程,它们形成了各自进程树的基座。
1
号进程为所有业务进程的根2
号进程为所有内核进程的根
以SSH
用户登录终端为对象进行具体观察,就可以明显发现这颗进程树!
# 查找0号、1号、2号进程
ps -ef | grep -E '^root\s+[1-9]+\s+0'
# 观察Init/Systemd 1号进程所形成的进程树
pstree -sp
# 以当前终端观察所形成的进程树
pstree -sp $$
# Output
systemd(1)───sshd(1088)───sshd(1591)───bash(1593)───pstree(1768)
SSH用户登录过程粗略介绍
从SSH
用户登录终端所形成的进程树,我们可以分析出来,以sshd
网络服务进程为根,在用户登录时,它fork了sshd
子进程。
该子进程作为与远程终端,与主机内bash shell
进程,进行背靠背协作工作!
每次终端上,执行一条shell
命令,就开辟另外一个bash shell
的子进程进行实际具体的工作,而最终,通过文件输入输出的串联链,将执行结果送递远程的终端!
- 当然,
SSH
内部过程比较复杂,这里仅是从进程树和文件句柄的视角进行粗略描述
背靠背模型图解
- 两种接口背靠背,进行移花接木
- 用
while true; do sleep 360; done
脚本命令,可以深入观察bash shell
子命令的输入输出句柄,依然是/dev/pts/*
文件证据链
# Output
systemd(1)───sshd(1088)───sshd(1591)───bash(1593)───pstree(1768)
# 观察打开文件句柄
lsof -nPp 1088
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
...
sshd 1088 root 3u IPv4 20514 0t0 TCP *:22 (LISTEN)
sshd 1088 root 4u IPv6 20516 0t0 TCP *:22 (LISTEN)
# 背靠背打开终端设备
lsof -nPp 1591
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
...
sshd 1591 root 3u IPv4 18945 0t0 TCP 192.168.2.168:22->192.168.2.111:64834
sshd 1591 root 8u CHR 5,2 0t0 1121 /dev/ptmx
sshd 1591 root 9u CHR 5,2 0t0 1121 /dev/ptmx
sshd 1591 root 12u CHR 5,2 0t0 1121 /dev/ptmx
# bash shell打开伪终端
lsof -nPp 1591
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
...
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
...
bash 1593 root 0u CHR 136,0 0t0 3 /dev/pts/0
bash 1593 root 1u CHR 136,0 0t0 3 /dev/pts/0
bash 1593 root 2u CHR 136,0 0t0 3 /dev/pts/0
# 前台控制句柄
bash 1593 root 255u CHR 136,0 0t0 3 /dev/pts/0
总结
- 进程树分形
- 文件链分形