最初に、私が見つけた情報に基づいxtermてxtermpidに数秒戻ってトレースしようとしました/proc/locksが、それは緩やかでした。つまり、うまくいったと思いますが、せいぜい環境的なものでした-ファイルが提供するすべての情報を完全に理解しておらず、その内容と既知の端末プロセスの間で一致すると思われるものと一致していました。
それから、pty間のlsof/straceアクティブなwrite/talkプロセスを見てみました。どちらのプログラムも実際に使用したことはありませんでしたが、依存しているようですutmp。対象となるpty utmpに何らかの理由でエントリがなかった場合、両者はその存在を認めることを拒否しました。たぶんそれを回避する方法があるかもしれませんが、私はそれを放棄するほど混乱していました。
でudevadm宣伝されptsてptmいるように/proc/tty/drivers、136と128のメジャー番号のデバイスノードでいくつかの発見を試みましたが、そのツールの非常に有用な経験が不足しており、実質的なものはありませんでした。興味深いことに、:min両方のデバイスタイプの範囲が驚くほどにリストされていることに気付きました0-1048575。
しかし、このカーネルドキュメントを再訪してから、mountsの観点から問題について考え始めました。私はそれを数回読んだことがありますが、その行の継続的な研究がこの2012年の/dev/ptsパッチセットに私を導いたとき、私は考えがありました:
sudo fuser -v /dev/ptmx
私は思った私は通常関連付けるプロセスに何を使うのですかmount?そして確かに:
USER PID ACCESS COMMAND
/dev/ptmx: root 410 F.... kmscon
mikeserv 710 F.... terminology
そのため、たとえば次のような情報を使用できますterminology。
sudo sh -c '${cmd:=grep rchar /proc/410/io} && printf 1 >/dev/pts/0 && $cmd'
###OUTPUT###
rchar: 667991010
rchar: 667991011
ご覧のとおり、少し明示的にテストすることで、このようなプロセスを作成して、任意のptyのマスタープロセスをかなり確実に出力できます。ソケットに関してはsocat、デバッガーではなくその方向からアプローチできることはかなり確かですが、その方法についてはまだ明らかにしていません。それでも、ssあなたが私よりもそれをよく知っているなら、私は助けるかもしれない:
sudo sh -c 'ss -oep | grep "$(printf "pid=%s\n" $(fuser /dev/ptmx))"'
そこで、実際にはもう少し明示的なテストを設定しました。
sudo sh <<\CMD
chkio() {
read io io <$1
dd bs=1 count=$$ </dev/zero >$2 2>/dev/null
return $((($(read io io <$1; echo $io)-io)!=$$))
}
for pts in /dev/pts/[0-9]* ; do
for ptm in $(fuser /dev/ptmx 2>/dev/null)
do chkio /proc/$ptm/io $pts && break
done && set -- "$@" "$ptm owns $pts"
done
printf %s\\n "$@"
CMD
これは、印刷さ$$NUM \0各PTYとチェック前のチェックに対する各マスター・プロセスのIOにNULLバイトを。違いがある場合、$$pidとptyを関連付けます。これは主に機能します。私にとっては、それは戻ります:
410 owns /dev/pts/0
410 owns /dev/pts/1
710 owns /dev/pts/2
それは正しいですが、明らかに、それは少し際どいです。つまり、それらの1人がその時点で大量のデータを読んでいたとしたら、おそらく見逃していたでしょう。私はsttyそれを修正できるように、最初にストップビットまたはそのような何かを送信するために別のptyでモードを変更する方法を見つけようとしています。
sudo find /proc/*/fd/0 -ls | grep '/dev/pts/4'、/proc/PID出力としてPIDのリスト()を提供します。