gpt4 book ai didi

linux - 对 mkfifo 的并发写入似乎丢失了

转载 作者:太空宇宙 更新时间:2023-11-04 11:58:55 25 4
gpt4 key购买 nike

我正在编写一个脚本来设置机器环境。我有能力在机器上放置一个启动脚本,所以我试图在我的“工作站”机器上使用 unix 中的命名管道在线。

问题是,我无法控制这些机器何时可以联机。总共有 20 多台机器同时启动,我试图模拟命名管道在有机会读取之前被多次写入的效果,结果令人吃惊……

我写了两个小测试脚本:

mkfifogen.sh

#!/bin/bash
mkfifo h
testing=""
sleep 10
for((i=0;i<5;i++));do
echo $I
while read line;do
testing+="$line"
done < h
done

echo "$testing"
rm -f h

mkfifowrite.sh

#!/bin/bash
for((i=0;i<5;i++));do
echo "this is a test $i" > h
done

当我运行 mkfifogen.sh 后跟 mkfifowrite.sh 时,输出如下

0
1
2

然后mkfifowrite.sh脚本退出,mkfifogen.sh脚本挂起

然后我必须再运行 mkfifowrite.sh 脚本 3 次,每次都会导致 mkfifogen.sh 脚本的输出再增加一次。最后一次运行会导致 testing 的值被输出 4 次,所以我在运行 4 次 mkfifowrite.sh 脚本和一次 mkfifogen.sh 脚本后的输出如下所示:

0
1
2
3
4
this is a test 0this is a test 1this is a test 2this is a test 3this is a test 4
this is a test 0this is a test 1this is a test 2this is a test 3this is a test 4
this is a test 0this is a test 1this is a test 2this is a test 3this is a test 4
this is a test 0this is a test 1this is a test 2this is a test 3this is a test 4

在分别运行 mkfifogen.sh 和 mkfifowrite.sh 之后,我期望看到的是:

0
1
2
3
4
this is a test 0this is a test 1this is a test 2this is a test 3this is a test 4

我在网上看了很多,对此有一些含糊不清的答案,但我似乎无法理解它们。我觉得这个链接可能包含我的答案,但我不确定 https://unix.stackexchange.com/questions/68146/what-are-guarantees-for-concurrent-writes-into-a-named-pipe

长话短说:

我如何确保对命名管道的所有写入,无论它们执行的速度有多快,都由读取独立处理?

最佳答案

读者一直读到 EOF,然后重复,直到收到 5 个 EOF。

作者打开和关闭管道 5 次。每次编写器关闭管道时,都存在潜在的 EOF 条件。它不会成为实际的 EOF,直到读者尝试阅读它(在阅读之前编写的所有内容之后)。

在这个潜在的 EOF 阶段,有一场比赛。写入者正在递增i并准备打开管道再次写入,而读取者正在完成read命令并处理结果,之后它将尝试再次读取.

如果编写器在读取器尝试读取之前执行了写入打开,则潜在的 EOF 条件就会消失。如果在编写器不再连接到管道时读取器尝试读取,则会发生 EOF。

如您所见,当一个管道有多个写入器时(无论是顺序的还是并行的),EOF 是一件很痛苦的事情。您不能期望它们可靠地出现在来自不同作者的消息之间。我的出路是设计协议(protocol),让阅读器不需要 EOF 来识别消息的结尾,然后让阅读器以读+写模式打开管道,这样总是 至少有一个现有的 writer,EOF 永远不会发生。

将消息保持在 PIPE_BUF 大小以防止它们被拆分是一个单独的问题,您也必须注意这一点。

关于linux - 对 mkfifo 的并发写入似乎丢失了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53239773/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com