仅复制PIPE_BUF字节时,系统调用splice的操作是否具备原子性?
管道写入原子性相关问题解答
结论
针对Linux平台(splice、sendfile、tee均为Linux特有的系统调用),当写入长度不超过PIPE_BUF时,这三类操作向管道执行的写入均保证原子性,和普通write调用遵循完全相同的规则。
原因说明
- Linux内核中所有向管道写入的逻辑最终都会进入统一的
pipe_write实现函数,上层无论是调用普通write,还是调用splice/sendfile/tee写入管道,都会走相同的判断分支:只要待写入总长度不超过PIPE_BUF,内核就会保证整个写入操作不会和其他写入操作穿插,写入内容连续不拆分。 - 文档未单独说明这几个系统调用的原子性,是因为
PIPE_BUF原子性是管道本身的属性,不是某类写入调用的属性:只要是向管道写入,不管走哪类系统调用,都会遵循管道自身的原子性规则。
注意事项
- 该规则仅适用于操作目标为管道(含匿名管道、命名管道)的场景,目标为其他类型文件描述符时不生效。
- 仅写入长度≤
PIPE_BUF时保证原子性,超过该长度的所有写入操作都不保证原子性,可能和其他写入操作的内容穿插。
内容的提问来源于stack exchange,提问作者JiaHao Xu
相关产品推荐
相关产品推荐

