linux一切皆文件扩展笔记
1、在linux中,一切皆为文件,所有不同种类的类型都被抽象成文件。如:普通文件、目录、字符设备、块设备、套接字等
2、当一个文件被进程打开,就会创建一个文件描述符。这时候,文件的路径就成为了寻址系统,文件描述符成为了字节流的接口
3、相对于普通文件这类真实存在于文件系统中的文件,tcp socket、unix domain socket等这些存在于内存中的特殊文件在被进程打开的时候,也会创建文件描述符。所以”一切皆文件”更准确的描述应该是”一切皆文件描述符”
其中相关的定义和文章在网上资料已经很多,这里记录一下学习阅读过程一些前辈的博客文章
- https://www.cnblogs.com/MrVolleyball/p/9957679.html
- https://www.cnblogs.com/MrVolleyball/p/9961793.html
- https://www.cnblogs.com/MrVolleyball/p/9987208.html
- https://www.cnblogs.com/MrVolleyball/p/9993137.html
扩展笔记
一些自己觉得常用的知识点提取记录
lsof
在之前的一些应用中,如swoole的端口占用问题等,会用到lsof -i :9501
来排查占用端口的进程信息等,
在学习到本章知识的时候,串联了起来。
lsof
的意思为 list open file,已经打开的文件描述符
,正好为linux系统中的一切皆文件描述符,所以不管是文件句柄、socket信息、设备信息等,都可以通过lsof命令来查询
通过不同参数控制筛选条件
-p pid : 输出指定进程打开的文件; -l : 输出中使用ID代替用户名; -u userName : 输出指定用户打开的文件; -c string : 输出 COMMAND 列中包含 string 的项; -d fd : 输出包含指定描述符的项; fileName : 输出打开文件 fileName 的所有项; -i [46] [protocol][@hostname|hostaddr][:service|port] : 输出符合指定条件的项,其中: 46 :分别指 IPv4、IPv6; protocol :指 TCP 或 UDP; hostname : 网络主机名; hostaddr : IP 地址; service : 包含在 /etc/services 中的名称; port : 端口号,可以是多个;
进程信息
查看进程下打开的文件描述符
ls -l /proc/进程ID/fd
total 0 lrwx------ 1 root root 64 Nov 5 02:39 0 -> /dev/pts/0 lrwx------ 1 root root 64 Nov 5 02:39 1 -> /dev/pts/0 lrwx------ 1 root root 64 Nov 5 02:39 2 -> /dev/pts/0 lrwx------ 1 root root 64 Nov 5 02:39 3 -> socket:[28724]
通过文件描述符fd 查询socket信息
grep 28724 /proc/net/unix
ffff90d8ba564000: 00000002 00000000 00010000 0001 01 28724 /tmp/server.sock
netstat -anp | grep 28724
unix 2 [ ACC ] STREAM LISTENING 28724 2554/python /tmp/server.sock
网络socket信息
tcp socket信息
more /proc/net/tcp
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode ... 4: 0100007F:56CE 0100007F:DE72 01 00000000:00000000 00:00000000 00000000 0 0 99155 1 ffff90d8bb0145c0 20 4 31 10 -1
这里面还有很多描述:比如慢启动门限、传输队列以及接收队列、窗口探查等TCP相关的重要参数都可以查询到,具体的大家可以去看下《TCP/IP详解卷》