私はbashでヘッドフォンが検出されたらヘッドフォンに切り替え、それ以外の場合はPulseAudioを使用して外部USBスピーカーに切り替える小さな「デーモン」を作成しました。
私が探しているのは、ファイルの変更に関する通知を実際のファイルの/proc/asound/card0/codec#0
ように受け取る方法です(/procの下のファイルを「偽のファイル」として扱います)。inotifywait
sleep 1
私のコードは一日中実行されているのでawk
(たとえば、1日に86400回)、少し奇妙であることがわかりました。 :)
while sleep 1; do
_1=${_2:-}
_2=$(awk '/Pin-ctls/{n++;if(n==4)print}' '/proc/asound/card0/codec#0')
[[ ${_1:-} = $_2 ]] ||
if [[ $_2 =~ OUT ]]; then
use_speakers
else
use_internal
fi
done
私は次のようなものを探しています(この例はうまくいきません)。
codec=/proc/asound/card0/codec#0
while inotifywait $codec; do
if [[ $(awk '/Pin-ctls/{n++;if(n==4)print}' $codec) =~ OUT ]]; then
use_speakers
else
use_internal
fi
done
これにより、ループ内のコマンドはファイルが実際に変更されたときにのみ実行されます$codec
。
ベストアンサー1
私が探しているのは、[プロセス内]ファイルの変更に関する通知を受け取る方法です。
ファイルではないのでできません。重複した質問ではありませんが、答えはここにあります理由を説明しました。
/proc
カーネルインタフェースです。そこには実際のファイルがないので変更できません。ハンドルから読むのは必要ファイルを読み取るとき、ファイルのデータはそれに対する答えです。
同様の状況をシミュレートする唯一の方法は、定期的にファイルを読み取り、内容を比較してカーネルの応答が変更されたことを確認することです。こうやったようです。
procfs ファイルを使用する場合、stat
atime と mtime は同じです。一部のファイルの場合は stat 呼び出し時間、他のファイルの場合はシステムの開始時間です。最初のケースでは常に変化しているように見えますが、2番目のケースではまったく変わっていないようです。