
デバイス ファイル 'debug_port' は、あるポートの出力です。3 つのスクリプトがあります:
最初のスクリプトは、ポートからの情報を待機し、同時にログ ファイルにデータを記録し、ログから grep を実行して debug_port にエコーしながら作業を実行します。
#first.sh
pkill cat
cat debug_port > $logfile1 &
running=$!
# perform its tasks...
kill $running
killall -s SIGPIPE cat
pkill -P $$
rm $logfile1
2 番目は他の情報を待機し、別の作業を実行します。
#second.sh
pkill cat
cat debug_port > $logfile2 &
running=$!
# <<< there is problem: no output from 'debug_port'
# perform its tasks...
kill $running
rm $logfile2
そして発信者は両方を順番に呼び出す
#caller.sh
./first.sh
./second.sh
問題は、2 番目のスクリプトに 'debug_port' からの出力がないことです。ただし、何かあるはずです。
答え1
デバイス ファイルを読み取っているとき、シークできない可能性があります。つまり、単一のストリームである可能性があります。その場合、1 つのプロセスからの読み取りによって、別のプロセスによる同じバイトの読み取りが妨げられます。したがって、2 つのプロセスで同時に読み取らないでください。
これを実行する必要があるときは、ストリームをフォークする必要があります。これにより、データをどこかに保存する必要があるため、より多くのメモリ RAM/ディスク (実装によって異なります) が使用される可能性があります。メモリの使用量については、プロセス間のレイアウトによって異なります。