我有一个 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
,但没有任何变化。我也尝试了 ,但得到的结果是一样的。-f
exit 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 的写入之一被阻塞,这意味着您的应用程序没有从管道中获取数据