信号()を実験する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
入力に対するプログラムの2つの応答の間に出力は表示されません'f'
。
修正する
申し訳ありません。以前のバージョンを貼り付けました。アンパサンドはここにあります。./signal <> mypipe &
上記のコードを修正しました。
アップデート2
roaimaが提案したようにandを追加しましたが、wait
何も変更されませんでした。私も試してみましたが、結果は同じでした。-f
exit 0
./signal < mypipe &
ベストアンサー1
&
バックグラウンドでコマンドを実行するようにシェルに指示します。あなたのスクリプトは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への書き込みの1つがブロックされていることを確認してください。これは、アプリケーションがパイプからデータを取得できないことを意味します。