管道并发读写中的部分数据读取可能性及小数据量写操作原子性咨询
管道并发读写中的部分数据读取可能性及小数据量写操作原子性咨询
嘿,这个问题问到点子上了,这可是Unix/Linux管道机制里的核心规则之一!
先给你一个明确的结论:当进程往管道写入的数据量小于PIPE_BUF字节时,这个写操作是完全原子性的。也就是说,并发读取的另一个进程绝对不会只读到这次写入的部分数据——要么完整获取到这整段数据,要么完全读不到(比如写操作还没完成),不存在读取到半截数据的情况。
为什么会这样?PIPE_BUF是系统定义的一个关键常量(不同系统具体值可能不同,比如常见的是4096字节),POSIX标准明确规定了:只要写入管道的数据量不超过PIPE_BUF,操作系统就会保证这个写操作不会被其他进程的写操作打断或拆分,数据会作为一个完整的整体被写入管道缓冲区。
反过来讲,如果写入的数据量超过了PIPE_BUF,那写操作就不再保证原子性了,这时候并发读进程才可能读到部分数据,剩下的后续才能读到。但针对你问的「小于PIPE_BUF」的场景,完全不用担心部分读取的问题。
关于标准依据,POSIX.1-2001及其后续的更新版本(比如POSIX.1-2008)都有相关规定:
对管道或FIFO的写操作,如果请求写入的字节数不大于
PIPE_BUF,则该操作应是原子的;也就是说,写入的数据不会与其他进程写入管道或FIFO的数据交错。
备注:内容来源于stack exchange,提问作者user1020828
相关产品推荐
相关产品推荐

