Siam博客

linux一切皆文件扩展笔记

2022-11-05

linux一切皆文件扩展笔记

1、在linux中,一切皆为文件,所有不同种类的类型都被抽象成文件。如:普通文件、目录、字符设备、块设备、套接字等
2、当一个文件被进程打开,就会创建一个文件描述符。这时候,文件的路径就成为了寻址系统,文件描述符成为了字节流的接口
3、相对于普通文件这类真实存在于文件系统中的文件,tcp socket、unix domain socket等这些存在于内存中的特殊文件在被进程打开的时候,也会创建文件描述符。所以"一切皆文件"更准确的描述应该是"一切皆文件描述符"

其中相关的定义和文章在网上资料已经很多,这里记录一下学习阅读过程一些前辈的博客文章

扩展笔记

一些自己觉得常用的知识点提取记录

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详解卷》

本文链接:
版权声明: 本文由 Siam原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权

扫描二维码,分享此文章