相关疑难解决方法(0)

并发写入命名管道的保证是什么?

例如,我创建了一个命名管道,如下所示:

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)

或者写入命名管道的过程是原子的?

linux pipe

34
推荐指数
1
解决办法
2万
查看次数

管道读取不大于 PIPE_BUF 原子吗?

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 字节的精确乘数,还是可以返回任意数量的字节?

linux pipe concurrency

5
推荐指数
1
解决办法
2916
查看次数

标签 统计

linux ×2

pipe ×2

concurrency ×1