『7x24小时有问必答』
插U盘是  /dev/sdb,连串口是  /dev/ttyUSB0,读键盘是  /dev/input/event0。Linux 为什么把所有东西都叫“文件”?因为键盘、网络、定时器、进程信息最终都变成一个 fd,select / poll / epoll 用一个循环就能全部监听。这其实是它最顺手的设计之一。

---

一、先看现象 /dev 下为什么全是硬件

第一次打开 Linux 的  /dev  目录,很多人会愣住:
$  ls  /dev

sda   sdb   ttyUSB0   input   null   zero   random

这里没有文档、没有图片,却列着硬盘、串口、键盘、随机数发生器。更奇怪的是,你可以像读文件一样读键盘:
$  sudo  cat  /dev/input/event0

按下回车,屏幕刷出一堆乱码——那就是按键事件。在 Linux 看来,键盘不过是一个可读的数据流。
本节要点:Linux 把硬件、内核对象、进程信息都放进  /dev、/proc、/sys,打开它们就像打开普通文本。

---

二、Linux 里的“文件”到底是什么

我们平时说的“文件”指硬盘上的数据,比如  .txt、.mp4。但 Linux 的“文件”是更宽泛的抽象:
文件 = 一段可以通过 open / read / write / close 访问的数据流。
数据存在磁盘、来自键盘缓冲区、还是内核实时生成,都不重要。重要的是接口统一。
类型
例子
数据来源
占磁盘吗
普通文件
/home/user/note.md
磁盘块
是
设备文件
/dev/sda
、/dev/ttyUSB0
硬件驱动
否
输入事件
/dev/input/event0
内核输入子系统
否
伪文件
/proc/cpuinfo
、/sys/class/gpio
内核实时生成
否
套接字
socket()
  返回的 fd
网络协议栈
否
本节要点:Linux 的“文件”是接口抽象,不是磁盘文件。能用四个基本动作访问的数据流,都可以叫文件。

---

三、键盘、鼠标、网络为什么都是文件

3.1 键盘鼠标

裸机读取键盘要处理中断、扫描码、消抖;Windows 要调专门 API。Linux 只需要:
int  fd = open("/dev/input/event0", O_RDONLY);

struct  input_event  ev;

read(fd, &ev,  sizeof(ev));

一个  read()  拿到按键的时间戳、键码、按下/松开状态。鼠标滚轮、坐标、点击同理。
平台
读键盘需要做什么
裸机/MCU
中断、扫描码、消抖
Windows
Raw Input / DirectInput API
Linux
open()
  +  read()  /dev/input/eventX
把输入设备做成文件,应用层就不用再背一套新 API。

3.2 网络

socket 本质上也是文件描述符:
int  sock = socket(AF_INET, SOCK_STREAM,  0);

write(sock,  "hello",  5);

read(sock, buf,  sizeof(buf));

close(sock);

高并发服务器里,每个连接就是一个 fd,全部交给  epoll_wait  统一监听。一个线程管几万个连接,靠的就是这个抽象。
本节要点:键盘鼠标是事件流文件,网络是双向字节流文件。应用层只关心 fd 里读到了什么。

---

四、/proc 和 /sys 也是文件

/proc  没有真正的磁盘文件,内容都是内核实时生成:
$  cat  /proc/cpuinfo            # CPU 信息

$  cat  /proc/meminfo            # 内存使用

$  cat  /proc/1234/status      # 进程状态

$  ls  /proc/1234/fd              # 进程打开的文件描述符

/sys  更偏向设备和驱动属性。操作 GPIO 就是写文件:
$  echo  17 > /sys/class/gpio/export

$  echo  out > /sys/class/gpio/gpio17/direction

$  echo  1 > /sys/class/gpio/gpio17/value

路径
用途
/proc/cpuinfo
看 CPU 型号、核心数
/proc/PID/fd
排查句柄泄漏
/sys/class/gpio
用户态控制 GPIO
/sys/class/net/eth0
看网卡 MAC、MTU
本节要点:进程、内存、CPU、GPIO 都被抽象成文件,用户空间用最普通的  open/write  就能访问内核数据。

---

五、这种设计带来什么好处

Unix 哲学里有一条:一切皆文件,所有工具只做一件事,程序之间用文本流协作。  Linux 继承了这个思路。

5.1 统一接口

不管对方是硬盘、键盘、网卡还是内核对象,open / read / write / close / epoll 足够应付大多数场景。学一套接口,管几乎所有资源。

5.2 组合性极强

因为接口统一,任何产生数据的“文件”都能进管道:
$  cat  /proc/cpuinfo | grep  "model name"  |  sort  |  uniq  -c

5.3 权限模型复用

文件权限系统直接套在设备文件上:
$  ls  -l /dev/ttyUSB0

crw-rw---- 1 root dialout 188, 0 Jul 8 10:00 /dev/ttyUSB0

只有  dialout  组能访问串口,不用额外写权限逻辑。

5.4 多路复用简单

select / poll / epoll  监听的是 fd。socket、timerfd、signalfd、eventfd 都是 fd,一个事件循环就能统一管理所有输入来源。
本节要点:一切皆文件带来统一接口、管道组合、权限复用、epoll 统一监听四大好处。

---

六、注意边界

“一切皆文件”是接口统一,不是语义完全相同:
坑
现象
解法
对 socket  lseek()
返回 ESPIPE
socket 不支持 seek
普通文件 fd 塞进 epoll
epoll_ctl
  报 EPERM
普通文件没有“就绪”概念
以为  /proc  内容固定
两次读取结果不同
动态生成,读一次用一次
读  /dev/input/event0  没权限
Permission denied
加入  input  组或用 sudo
对  /sys  写错值
驱动报错
先  cat  看当前值再写
本节要点:统一的是访问接口,不是语义。读写时仍要尊重每个对象的本性。

---

七、总结

Linux 的“一切皆文件”,本质是把所有资源都抽象成字节流。不是说所有东西都是磁盘文件,而是说:只要用 open / read / write / close 这套语言描述,键盘、鼠标、网络、进程、GPIO 都能被统一访问。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

上一主题上一主题         下一主题下一主题
QQ手机版小黑屋粤ICP备17165530号

关于我们·投诉举报· 用户帮助· 联系我们 · 本站服务 · 版权声明· 隐私政策 · 投搞指南

法律保护:PLC技术网,plcjs.com,plcjs.net等字样
Copyright 2010-2030. All rights reserved. 


微信公众号二维码 抖音二维码 百家号二维码 今日头条二维码哔哩哔哩二维码