Сначала я попытался проследить несколько xterm
секунд назад до xterm
pid, основываясь на информации, которую я нашел, /proc/locks
но это было свободно. Я имею в виду, что это работало, я думаю, но в лучшем случае это было финансово - я не до конца понимаю всю информацию, которую предоставляет файл, и соответствовал только тому, что, казалось, соответствовало его содержанию и известным терминальным процессам.
Затем я попытался посмотреть lsof/strace
на активный write/talk
процесс между ptys. Я никогда раньше не использовал ни одну из этих программ, но, похоже, они полагаются utmp
. Если у моего целевого pty utmp
по какой-либо причине не было записи, они оба отказывались признать, что она существует. Может быть, есть способ обойти это, но я был достаточно смущен, чтобы отказаться от него.
Я попробовал некоторые udevadm
открытия с 136 и 128 старшими узлами устройств, как рекламировалось pts
и ptm
соответственно в нем /proc/tty/drivers
, но у меня также не было очень полезного опыта работы с этим инструментом, и я снова не нашел ничего существенного. Интересно, что я заметил, что :min
диапазон для обоих типов устройств был ошеломляющим 0-1048575
.
До тех пор, пока я не вернулся к этому документу по ядру , я начал думать о проблеме с точки зрения mount
s. Я прочитал , что несколько раз до этого, но когда продолжение исследований в этой линии привело меня к этому это 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
null-байтов для каждого pty и проверяет io каждого главного процесса на соответствие предыдущей проверке. Если разница, $$
то он связывает pid с pty. Это в основном работает. Я имею в виду, для меня это возвращает:
410 owns /dev/pts/0
410 owns /dev/pts/1
710 owns /dev/pts/2
Что правильно, но, очевидно, это немного круто. Я имею в виду, если бы один из тех других читал в кучу данных в то время, он, вероятно, пропустил бы. Я пытаюсь выяснить, как изменить stty
режимы на другом pty, чтобы сначала отправить стоп-бит или что-то в этом роде, чтобы я мог это исправить.
sudo find /proc/*/fd/0 -ls | grep '/dev/pts/4'
, предоставил бы список PID (/proc/PID
) в качестве вывода.