我需要用 mkfifo 创建一个命名管道。例如:
mkfifo mypipe
我将有一个从管道读取的 systemd 服务(一个简单的 shell 脚本),并且我将在同一管道上编写调用另一个脚本(例如write-to-pipe.sh
)。
write-to-pipe.sh
如果我在管道上同时有多个写入实例怎么办?我的意思是,许多用户可以执行write-to-pipe.sh
.如果两个用户尝试同时在管道上写入,是否会造成麻烦(就像两个用户尝试在常规文件(而不是管道)上写入并且其中一个用户覆盖另一个用户时)?
我希望这不是重复的,但我找不到这个问题的答案......
谢谢
答案1
这是我运行的快速测试:
mkfifo foo
yes "Process 1 reporting" > foo & yes "This is process 2" > foo &
awk '!a[$0]++' < foo
我从 awk 得到的输出:
Process 1 reporting
Process 1 reportThis is process 2
This is process 2
This is pring
Process 1 reportocess 2
ing
ocess 2
This is prProcess 1 reporting
答案2
sem
使用GNU Parallel 中的类似内容:
mkfifo myfifo
sem --id myid 'seq 1 10; sleep 1; echo done' > myfifo &
sem --id myid 'seq 2 10; sleep 1; echo done' > myfifo &
sem --id myid 'seq 3 10; sleep 1; echo done' > myfifo &
sem --id myid 'seq 4 10; sleep 1; echo done' > myfifo &
cat myfifo