在 Linux 系统中,所有硬件和外设都被抽象为文件,存放在 /dev 目录中。根据访问方式和数据结构的不同,Linux 设备主要可以分为三种类型:字符设备、块设备和网络设备。搞清楚它们各自的特点,对理解系统运行机制很有帮助。

一、字符设备
字符设备(character device)是最常见的一类设备,它以字节流的方式进行顺序访问,不支持随机寻址。这类设备通常对应键盘、鼠标、串口、终端等。在用户空间,我们可以像读写普通文件一样用 read() 和 write() 来操作,但数据是一字节一字节流动的。
使用 ls -l /dev 命令时,字符设备的文件类型标识为 c。例如下面的设备节点就表示一个字符设备:
crw-rw---- 1 root dialout 4, 64 Apr 10 10:00 /dev/ttyS0
字符设备简单示例
我们可以用如下 C 代码打开一个字符设备并读取数据:
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
int main() {
int fd = open("/dev/tty", O_RDONLY); // 打开字符设备终端
if (fd < 0) {
perror("open failed");
return 1;
}
char buf[128];
int n = read(fd, buf, sizeof(buf)); // 按字节流读取
write(STDOUT_FILENO, buf, n);
close(fd);
return 0;
}二、块设备
块设备(block device)以固定大小的数据块为单位进行读写,支持随机访问。典型的块设备包括硬盘、SSD、U 盘等。块设备通常由文件系统层管理,用户很少直接读写设备文件,而是将其挂载后访问其中的文件。
在 /dev 中,块设备的标识为 b。比如:
brw-rw---- 1 root disk 8, 0 Apr 10 10:00 /dev/sda
块设备与字符设备对比
| 特性 | 字符设备 | 块设备 |
|---|---|---|
| 访问方式 | 字节流顺序 | 数据块随机 |
| 是否缓冲 | 一般无 | 有缓存 |
| 常见例子 | 键盘、串口 | 硬盘、U盘 |
三、网络设备
网络设备(network device)比较特殊,它不对应 /dev 下的文件节点,而是通过套接字(socket)进行数据包的发送和接收。像网卡、虚拟网桥都属于这一类。内核中用 net_device 结构表示,用户态通过 ifconfig 或 ip 命令查看。
下面是用 C 语言创建一个 UDP 套接字来收发数据的简化示例,体现网络设备的使用方式:
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main() {
int sock = socket(AF_INET, SOCK_DGRAM, 0); // 网络设备的用户态接口
if (sock < 0) {
perror("socket failed");
return 1;
}
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(8080);
addr.sin_addr.s_addr = INADDR_ANY;
bind(sock, (struct sockaddr*)&addr, sizeof(addr));
// 此后可用 recvfrom/sendto 收发数据包
close(sock);
return 0;
}四、总结
Linux 设备类型可以归纳为:字符设备处理流式数据,块设备处理可随机访问的存储,网络设备走协议栈不落 dev 节点。掌握这三类设备的区别,能帮你在写驱动、查故障或者做系统优化时少走弯路。
Linux_devicecharacter_deviceblock_device修改时间:2026-07-31 07:09:21