私は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番目のケースではまったく変わっていないようです。
答え2
PulseAudio を使用している場合は、pactl subscribe
次の手順を実行します。
答え3
また、ポーリングによって特定のファイルの変更を監視することが許可されていることに注意してください/proc/
。たとえば、これにより、ファイルman proc
について次の内容を読み取ることができます。/proc/self/mounts
/proc/[pid]/mounts (Linux 2.4.19 以降) このファイルは、プロセスのマウント名前空間に現在マウントされているすべてのファイルシステムを一覧表示します (mount_namespaces(7) を参照)。このファイルの形式はfstab(5)に文書化されています。
カーネルバージョン2.6.15以降、このファイルはポーリング可能です。ファイルを読み取るために開いた後、このファイルの変更(ファイルシステムのマウントやマウント解除など)により、select(2)はファイル記述子に例外があることを示します。 (2)とepoll_wait(2)は、ファイルに優先順位イベント(POLLPRI)があることを示します。 (Linux 2.6.30より前では、このファイルの変更はファイル記述子として表示され、select(2)では読み取り可能としてマークされ、poll(2)およびepoll_wait(2)ではエラー状態としてマークされました。)
これは、次の質問で実装されます。
https://stackoverflow.com/questions/5070801/monitoring-mount-point-changes-via-proc-mounts
答え4
ファイルの変更をnetlink
監視するために使用してみてください。/proc
https://mdlayher.com/blog/linux-netlink-and-go-part-1-netlink/