처음에는 내가 찾은 정보를 기반으로 몇 가지 xterm
를 xterm
pid 로 추적하려고 시도했지만 /proc/locks
느슨했습니다. 나는 그것이 효과가 있다고 생각하지만 그것은 최선의 상황이었다. 나는 파일이 제공하는 모든 정보를 완전히 이해하지 못하고 그 내용과 알려진 터미널 프로세스 사이에 일치하는 것처럼 일치하는 것만 일치했다.
그런 다음 ptys 사이 lsof/strace
의 활성 write/talk
프로세스를 보았습니다 . 나는 실제로 이전에 어느 프로그램도 사용하지 않았지만 그들은 의지하는 것 같습니다 utmp
. 내 대상 pty utmp
에 어떤 이유로 든 항목 이 없으면 둘 다 존재한다고 인정하기를 거부했습니다. 어쩌면 그 주위에 방법이있을 수 있지만 그것을 버릴만큼 혼란 스러웠습니다.
나는 약간의 노력 udevadm
에 대한 광고로 136 개 128 주 번호 장치 노드 발견을 pts
하고 ptm
각각에 /proc/tty/drivers
, 그러나 나는 또한 도구로 어떤 매우 유용한 경험이 부족하고 다시 상당한 아무것도를 설정합니다. 그러나 흥미롭게도 :min
두 장치 유형 의 범위가 엄청나게 높았습니다 0-1048575
.
이 커널 문서 를 다시 방문하기 전까지 는 문제에 대해 생각하기 시작했습니다 mount
. 나는 여러 번 읽은 적이 있지만 그 라인을 계속 연구했을 때이 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
각 pty에 $$
num \0
null 바이트를 인쇄 하고 이전 검사와 비교하여 각 마스터 프로세스의 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
)을 출력으로 제공합니다.