当前位置: 首页 > news >正文

系统调用-write

Linux 系统调用 write 深度解析:向内核提交数据的统一接口

在 Linux 应用开发中,write 是最基础、最重要的系统调用之一。无论是向终端输出文本、写日志文件、向串口发送字节、对 I2C/SPI 设备写寄存器,还是通过 socket 发送网络数据,都依赖 write。因此,理解 write 的工作机制,有助于全面掌握 Linux 的统一 I/O 体系。


1. write 的函数原型

#include <unistd.h>ssize_t write(int fd, const void *buf, size_t count);

参数说明如下:

参数 类型 说明
fd int 文件描述符,由 opensocket 等函数返回
buf void* 用户空间待写入的数据缓存区域
count size_t 请求写入的字节数

返回值:

  • 成功:实际写入的字节数(可能小于 count
  • 失败:返回 -1,并设置 errno

2. write 的核心作用

调用 write 并不意味着直接把数据写入磁盘或设备,而是:

将用户态数据复制到内核态,再由对应的文件对象(file object)进行处理。

不同类型的文件对象(普通文件、设备文件、socket、管道等)对写入数据的处理方式完全不同。例如:

  • 普通文件 → 写入页缓存(page cache)
  • 终端 → 输出到终端驱动
  • 串口 /dev/ttyS1 → 经 UART 驱动发送字节
  • I2C /dev/i2c-1 → 驱动将数据封装成 I2C 传输
  • Socket → 进入网络协议栈
  • 管道/FIFO → 写入内核缓冲区

由此可见,write 是 Linux I/O 抽象的统一入口。


3. 示例:向文件写入内容

以下示例展示如何向普通文件写数据:

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>int main() {int fd = open("log.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);if (fd < 0) {perror("open");return -1;}const char *msg = "Hello Linux write!\n";ssize_t n = write(fd, msg, strlen(msg));if (n < 0) {perror("write");return -1;}printf("write %zd bytes\n", n);close(fd);return 0;
}

4. 为什么实际写入字节可能少于 count

write 的返回值不一定等于预期写入字节数,可能的原因包括:

● 被信号中断(EINTR)

写入尚未完成便被打断。

● 文件系统空间不足

导致部分写入失败。

● 写入 socket 或管道

缓冲区已满,只能写入部分数据。

● 写入设备文件

设备驱动自身可能只接收固定大小的数据包。

因此,对关键写操作通常需要循环调用 write

ssize_t total = 0;
while (total < len) {ssize_t n = write(fd, buf + total, len - total);if (n <= 0) {if (errno == EINTR) continue;perror("write");break;}total += n;
}

5. 内核执行流程简述

一次完整的 write 调用通常包含以下步骤:

用户态 buffer↓ copy_from_user()
内核态临时 buffer↓
file 对象的 file_operations->write() 回调↓
文件系统 / 设备驱动 / 网络协议栈↓
最终输出到存储介质或硬件设备

该流程说明:

  • 写文件通常并非实时落盘,而是先进入 page cache
  • 对设备文件的写入行为由驱动完全决定
  • 对网络 socket 的写入将由协议栈处理

6. 与嵌入式系统的类比

在嵌入式开发中通常会看到类似:

uart_write();
i2c_write();
flash_write();

而在 Linux 中,上述操作全部统一抽象为:

write(fd, buf, len);

驱动开发者只需实现:

ssize_t mydriver_write(struct file *file, const char __user *buf, size_t count);

即可通过设备节点提供标准的写接口。


7. 常见错误与排查方法

● 权限错误(EACCES)

检查:

ls -l <file>

必要时使用 chmodsudo


● 写入设备失败

常见原因:

  • 设备未初始化
  • 驱动返回 -EIO
  • 设备忙(EBUSY)
  • 缓冲区溢出

建议利用 strace 观察行为:

strace -e write ./program

● 写入 /dev/video0 无效

V4L2 大部分操作依赖 ioctl 而非 write,属于正常情况。


8. 示例:向串口写数据

int fd = open("/dev/ttyS1", O_RDWR | O_NOCTTY);
char buf[] = "AT\r\n";
write(fd, buf, sizeof(buf));

9. 示例:向 socket 写数据

write(sockfd, "hello", 5);

此时数据将由 TCP/UDP 协议栈处理。


10. 小结

write 是 Linux I/O 框架中的核心系统调用。其主要特点包括:

  • 提供向文件对象提交数据的统一接口
  • 实际写入行为由文件系统或驱动决定
  • 返回值可能小于请求写入字节数
  • 对普通文件而言通常会先写入 cache
  • 对设备文件和 socket 而言具有完全不同的语义

理解 write,能够为进一步掌握 Linux 关于设备驱动、文件系统、网络编程等领域打下坚实基础。

http://www.rkmt.cn/news/81497.html

相关文章:

  • 2025年全自动封膜仪品牌推荐/哪个品牌评价好/全自动封盖机哪个品牌性价比高/有哪些品牌 - 品牌推荐大师1
  • 葆阳植物饮品:一杯温和补阳,给身体攒够 “暖能量”
  • 2025年年终电竞培训学校推荐:基于行业权威认证与真实成功案例的5家高可靠性机构深度解析 - 品牌推荐
  • 2025 3D机器视觉的发展趋势
  • 酒店设计施工一体化公司推荐:行业优质服务选择 - 品牌排行榜
  • 推荐几家TikTok营销推广公司(12月更新),五家效果不错的TikTok海外推广公司盘点 - 品牌2025
  • EPC展厅装修公司推荐:行业优选机构盘点 - 品牌排行榜
  • Go 语言 GUI 制作全景指南:主流库实战与选型
  • CF2161H Cycle Sort
  • (2025年)喷雾剂灌装机哪些品牌好、哪家口碑好、哪家品质好、哪家公司好 - 品牌推荐大师
  • 上海实邦电子:以嵌入式开发为核心,赋能产品智能化升级 - 速递信息
  • 2025国内稳定性较好的、灵敏度高的、智能高效的镀层检测生产商/知名品牌/优质厂家排名/靠谱厂家/推荐品牌/头部企业 - 品牌推荐大师1
  • 2025年黑龙江自闭症学校机构权威榜单:黑龙江孤独症学校/黑龙江自闭症康复学校/黑龙江孤独症康复学校推荐指南 - 品牌推荐官
  • 2025年本地环氧地坪商家排行,看谁的大理石翻新养护更出色,可靠的大理石翻新养护忠博盛涛保洁专注产品质量 - 品牌推荐师
  • python _—— 使用hash函数实现一种类似字典的简易hash存储结构
  • 2025年ai收银机源头厂家推荐榜单:收银机收款‌/银行收银机‌/餐饮收银机一体机源头厂家精选 - 品牌推荐官
  • 2025 年湖南湘潭排油烟工程厂家最新推荐榜,技术实力与市场口碑深度解析消防工程/洁净工程/恒温恒湿工程/通风工程公司推荐 - 品牌鉴赏师
  • 2025年车铣复合加工订做厂家权威推荐榜单:插针加工厂/电极供货厂/航空插头源头厂家精选 - 品牌推荐官
  • 2025年靠谱学术会议服务公司推荐!学术研讨会/学术年会/学术交流会/学术峰会/合肥学术会议策划公司 - 麦麦唛
  • Python - 笔记
  • 使用 LangChain 搭建一个 AI Agent:从零到可运行 Demo
  • 净化车间制造厂家2025最新榜单出炉!无锡新源环保引领行业新标杆! - 深度智识库
  • 2025 年 12 月实验室整体解决方案实力推荐:涵盖实验室规划设计、实验室装修、实验台通风柜定制集成一站式服务,源头工厂专业可靠高效省心 - 深度智识库
  • 【2025权威发布】长轴液下泵|不锈钢液下泵|不锈钢化工泵|衬氟磁力泵|自吸磁力泵哪个厂家品质口碑好,知名企业品牌排行——亚梅泵业出众 - 品牌推荐大师1
  • 海外仓WMS系统选型:自研vsSaaS模式,企业该怎么选?
  • 2025年毛绒玩具除尘机工厂权威推荐榜单:毛绒玩具吹毛机/玩具行业封箱打包机/封箱打包机源头厂家精选 - 品牌推荐官
  • 2025年铁基催化剂生产厂家权威推荐榜单:沼气脱硫剂/高效脱硫剂/煤气脱硫催化剂源头厂家精选 - 品牌推荐官
  • 2025年真空皮带过滤机源头厂家推荐榜单:橡胶真空过滤机‌/水平真空过滤机‌/水平带式过滤机源头厂家精选 - 品牌推荐官
  • 完整教程:多智能体框架AgentScope 1.0 深度技术剖析:架构、场景、选型与实战指南
  • 洛谷 P3706