sendfile 比 readwrite 快因其在内核态直接搬运数据省去两次内存拷贝和上下文切换实测大文件传输吞吐提升20%–40%但要求 in_fd 为普通文件、out_fd 为 socket且需注意参数设置与常见 EINVAL 错误原因。sendfile 为什么比 read write 快因为 sendfile 在内核态直接完成文件到 socket 的数据搬运全程不经过用户空间——省掉两次内存拷贝read 到用户缓冲区、write 从用户缓冲区到 socket 缓冲区也避免了上下文切换开销。对大文件尤其明显比如传输 1GB 文件时实测吞吐能提升 20%–40%取决于磁盘 I/O 和网卡带宽是否均衡。但注意sendfile 要求输入 fd 是普通文件支持 mmap输出 fd 必须是 socket 或另一个支持 splice 的文件类型不能用于任意 fd 组合比如 pipe → socket 就不行得用 splice。Linux 下 sendfile 的基本用法和参数陷阱sendfile 系统调用原型是ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count)。关键点不在函数本身而在参数怎么设out_fd 必须是已连接的 socketSOCK_STREAM且不能是监听 socketlisten_fdin_fd 必须通过 open(..., O_RDONLY) 打开不能是 stdin 或管道O_DIRECT 会破坏 page cache反而拖慢 sendfile别加offset 如果为 NULL则从当前文件偏移开始读但多数场景建议传入指针并初始化为 0否则多次调用时位置错乱count 不宜设太大如 128MB内核单次处理上限受 /proc/sys/fs/pipe-max-size 和 socket 缓冲区影响通常设 64*1024 或 128*1024 更稳遇到 “Invalid argument” 错误的常见原因调用 sendfile 返回 -1 并设置 errno EINVAL 是最常踩的坑不是代码写错了而是环境或 fd 状态不对 稿定AI 拥有线稿上色优化、图片重绘、人物姿势检测、涂鸦完善等功能