/proc 下のファイル変更通知

/proc 下のファイル変更通知

私は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 ファイルを使用する場合、statatime と mtime は同じです。一部のファイルの場合は stat 呼び出し時間、他のファイルの場合はシステムの開始時間です。最初のケースでは常に変化しているように見えますが、2番目のケースではまったく変わっていないようです。

おすすめ記事