Lúc đầu, tôi đã cố gắng truy tìm một vài xtermgiây trở lại xtermpid dựa trên thông tin tôi tìm thấy /proc/locksnhưng nó bị lỏng lẻo. Ý tôi là, nó hoạt động, tôi nghĩ vậy, nhưng đó là tình huống tốt nhất - tôi không hiểu đầy đủ tất cả thông tin mà tập tin cung cấp và chỉ khớp với những gì dường như tương ứng giữa nội dung của nó và các quy trình đầu cuối đã biết.
Sau đó, tôi đã cố gắng xem lsof/stracetrên một write/talkquá trình hoạt động giữa các ptys. Tôi chưa bao giờ thực sự sử dụng một trong hai chương trình trước đây, nhưng chúng dường như dựa vào utmp. Nếu pty mục tiêu của tôi không có utmpmục vì bất kỳ lý do gì cả hai đều từ chối thừa nhận rằng nó tồn tại. Có lẽ có một cách xung quanh đó, nhưng tôi đã đủ bối rối để từ bỏ nó.
Tôi đã thử một số udevadmkhám phá với 136 và 128 nút thiết bị số chính như được quảng cáo ptsvà ptmtương ứng /proc/tty/drivers, nhưng tôi cũng thiếu bất kỳ trải nghiệm rất hữu ích nào với công cụ đó và một lần nữa không có gì đáng kể. Thật thú vị, mặc dù, tôi nhận thấy :minphạm vi cho cả hai loại thiết bị được liệt kê ở mức đáng kinh ngạc 0-1048575.
Tuy nhiên, cho đến khi tôi xem lại tài liệu hạt nhân này , tôi mới bắt đầu nghĩ về vấn đề này mount. Tôi đã đọc điều đó nhiều lần trước đây nhưng khi tiếp tục nghiên cứu về dòng đó đã đưa tôi đến bản vá năm 2012 này,/dev/pts tôi có một ý tưởng:
sudo fuser -v /dev/ptmx
Tôi nghĩ những gì tôi thường sử dụng để liên kết các quá trình với một mount? Và chắc chắn:
USER PID ACCESS COMMAND
/dev/ptmx: root 410 F.... kmscon
mikeserv 710 F.... terminology
Vì vậy, với thông tin đó tôi có thể làm, ví dụ từ terminology:
sudo sh -c '${cmd:=grep rchar /proc/410/io} && printf 1 >/dev/pts/0 && $cmd'
###OUTPUT###
rchar: 667991010
rchar: 667991011
Như bạn có thể thấy, với một chút thử nghiệm rõ ràng, một quy trình như vậy có thể được thực hiện để tạo ra một cách đáng tin cậy quá trình tổng thể của một pty tùy ý. Về các ổ cắm, tôi khá chắc chắn một người có thể tiếp cận nó từ hướng đó cũng socatnhư sử dụng trái ngược với trình gỡ lỗi, nhưng tôi vẫn chưa nói rõ làm thế nào. Tuy nhiên, tôi nghi ngờ sscó thể giúp đỡ nếu bạn quen thuộc với nó hơn tôi:
sudo sh -c 'ss -oep | grep "$(printf "pid=%s\n" $(fuser /dev/ptmx))"'
Vì vậy, tôi đã thiết lập nó với một thử nghiệm rõ ràng hơn một chút, thực sự:
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
Nó in $$num \0null null cho mỗi pty và kiểm tra io của mỗi tiến trình chính so với kiểm tra trước đó. Nếu sự khác biệt là $$nó liên kết pid với pty. Điều này chủ yếu hoạt động. Ý tôi là, đối với tôi, nó trả về:
410 owns /dev/pts/0
410 owns /dev/pts/1
710 owns /dev/pts/2
Điều này là chính xác, nhưng, rõ ràng, đó là một chút không phù hợp. Ý tôi là, nếu một trong những người khác đang đọc một loạt dữ liệu vào thời điểm đó thì có lẽ nó sẽ bị mất. Tôi đang cố gắng tìm ra cách thay đổi các sttychế độ trên một pty khác để gửi bit stop trước hoặc một cái gì đó tương tự để tôi có thể khắc phục điều đó.
sudo find /proc/*/fd/0 -ls | grep '/dev/pts/4', sẽ cung cấp danh sách các PID (/proc/PID) làm đầu ra.