例如,我创建了一个命名管道,如下所示:
mknod myPipe p
Run Code Online (Sandbox Code Playgroud)
我从某个进程(例如,某个服务器)中读取了它。例如,我使用了尾巴:
tail -f myPipe
Run Code Online (Sandbox Code Playgroud)
如果多个客户端进程将一些消息写入其中(例如,echo "msg" >> myPipe
,消息是否有可能交错,如下所示:
<beginning of message1><message2><ending of message1>
Run Code Online (Sandbox Code Playgroud)
或者写入命名管道的过程是原子的?
GNU C 库手册简要提到管道的读取和写入都是原子的
如果写入的数据大小不大于 PIPE_BUF,则读取或写入管道数据是原子的。
但是,Linux 上的手册页,如man 7 pipe,没有提到读取是原子的,并且man 2 read明确指出,如果读取被信号中断,则 read 可能返回少于请求的数量。
那么对具有以下读取长度的管道的读取调用PIPE_BUF
在 Linux 上真的是原子的吗?
特别是,如果一个作家管道总是写,例如,12字节块,并有2个为12个字节读管道管并发读取,执行这些读者要么得到确切12字节读取或类似的错误EAGAIN
有不可能获得部分阅读?
另外,当作者按 12 字节块写入但并发读者尝试PIPE_BUF/12
一次读取最多块时,情况如何?成功的读取是否总是返回 12 字节的精确乘数,还是可以返回任意数量的字节?