私はbashで小さな 'デーモン'を作成しました。検出された場合はヘッドフォンに切り替わり、検出されなかった場合はPulseAudioで外部USBスピーカーに切り替わります。
私が探しているのは、実際のファイルに対してinotifywait
が行うのと同じように、ファイル/proc/asound/card0/codec#0
に対する変更の通知を取得するいくつかの方法です(/ procの下のファイルを「疑似ファイル」と見なす) 。
awk
を使用して終日sleep 1
を実行するため、コードは少し異常です。つまり、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
ファイルに実際の変更があった場合にのみ実行されます。
私が探しているのは、ファイルの変更の通知を取得するいくつかの方法です[プロセス内]
それらはファイルではないため、できません。これはまったく同じ質問ではありませんが、 ここでの答え が理由を説明しています。
/proc
はカーネルインターフェイスです。そこには実際のファイルがないため、変更できません。ハンドルからの読み取りは要求であり、読み取り時のファイル内のデータはその応答です。
このようなものをシミュレートできる唯一の方法は、ファイルを定期的に読み取り、内容を比較して、カーネルからの応答が変更されたかどうかを確認することです。
stat
procfsファイルの場合、atimeとmtimeは同じになります。ファイルによっては、stat呼び出しが行われたときはいつでも、その他の場合はシステムブート中からの時間です。前者の場合は常に変化しているように見え、後者の場合は変化したようには見えません。
PulseAudioを使用している場合は、pactl subscribe
はこれを行います。
また、/proc/
たとえば、man proc
について次のように読むことができます/proc/self/mounts
ファイル:
/ proc/[pid]/mounts(Linux 2.4.19以降)このファイルは、プロセスのマウント名前空間に現在マウントされているすべてのファイルシステムをリストします(mount_namespaces(7)を参照)。このファイルのフォーマットは、fstab(5)に文書化されています。
カーネルバージョン2.6.15以降、このファイルはポーリング可能です。読み取りのためにファイルを開いた後、このファイルの変更(つまり、ファイルシステムのマウントまたはアンマウント)により、select(2)はファイル記述子に例外条件があるとマークします。 poll(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