bash 脚本中的命名管道

bash 脚本中的命名管道

我有一个 C 程序来试验信号 ( ./signal)。它处理标准输入,在读取 a 时退出'q'并对信号做出反应。

我想使用命名管道 (fifo) 通过 bash 脚本对其进行测试。目前我有这个:

#!/bin/bash

rm mypipe
mkfifo mypipe

./signal <> mypipe &

echo f > mypipe
echo hello
echo f > mypipe
echo q > mypipe

rm mypipe

如果我运行它,那么我可以看到程序的预期输出,但是,echo hello在程序对输入的两个响应之间并没有出现应有的输出'f'

更新

抱歉,我粘贴了旧版本,&符号在这里:./signal <> mypipe &,我更正了上面的代码。

更新2

我按照 roaima 的建议添加了和wait,但没有任何变化。我也尝试了 ,但得到的结果是一样的。-fexit 0./signal < mypipe &

答案1

告诉&shell 在后台运行该命令。您的脚本mkfifo mypipe在后台运行以创建管道设备,这对我来说似乎毫无意义,但不会./signal <> mypipe在后台运行。除非此 C 程序分叉并允许父程序立即返回,否则它将阻止脚本继续,并且直到退出echo后才能到达后续命令signal

#!/bin/bash

# Create the pipe
rm -f mypipe
mkfifo mypipe

# Run the application in the background
./signal <> mypipe &

# Apply tests
echo f > mypipe
echo hello
echo f > mypipe
echo q > mypipe

# Wait for the application to terminate (a no-op if it's already gone)
wait

# Tidy up
rm -f mypipe
exit 0

请注意,您的程序(以及此修改后的程序)永远不会从 FIFO 读取数据,因此如果您的signal应用程序写入管道,它可能会阻塞。

如果您发现测试工具未按预期工作,请启用调试

bash -x testscript    # run the script

我希望您会发现对 FIFO 的写入之一被阻塞,这意味着您的应用程序没有从管道中获取数据

相关内容