Đó là fd cho phía chủ của thiết bị đầu cuối giả trong trình giả lập thiết bị đầu cuối mà bạn muốn theo dõi nếu bạn muốn xem những gì được hiển thị trên đó. Fd chính đó là những gì mô phỏng dây đi đến một thiết bị đầu cuối thực sự. Những gì xtermviết trên đó là các ký tự được tạo từ phím bạn nhấn. Những gì nó đọc từ nó là những gì nó hiển thị.
Chẳng hạn, trên Linux:
$ lsof -ac xterm /dev/ptmx
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
xterm 15173 chazelas 4u CHR 5,2 0t0 2131 /dev/ptmx
Và sau đó chạy ví dụ:
stty -echo -opost
strace -e read -e read=4 -p15173 2>&1 | stdbuf -o0 sh -c '
grep "^ |" | cut -b11-60 | tr -d " " | xxd -r -p'
Tất nhiên, nó hoạt động tốt hơn nếu bạn chạy nó trong một thiết bị đầu cuối cùng loại và kích cỡ như thiết bị bạn đang cố gắng theo dõi. Bạn có thể nhận được kích thước với:
stty size < /dev/pts/that-terminal
Đó là bãi gì được đọc bởi xtermtừ phía chủ nhân của các thiết bị đầu cuối, vì vậy những gì được hiển thị ở đó, bao gồm cả các địa phương echovề những gì đang được gõ.
Ở -e read=4trên là straceđể xuất ra một hexdump của những gì xtermđọc trên fd của nó 4. Phần còn lại của lệnh là để chuyển đổi nó thành các ký tự thực tế. Tôi đã cố gắng peekfd -n -8 15173 4nhưng vì một số lý do chỉ đưa ra những gì được viết.
Chúng tôi đang sử dụng -opostđể vô hiệu hóa bất kỳ quá trình xử lý hậu kỳ nào trong thiết bị đầu cuối giám sát của mình, để mọi thứ xxdghi vào phía nô lệ làm cho nó không thay đổi về phía chủ của chúng tôi, để việc giám sát của chúng tôi xtermcó được điều tương tự như giám sát. -echolà để nếu ứng dụng trong thiết bị đầu cuối được giám sát gửi một chuỗi thoát yêu cầu câu trả lời từ thiết bị đầu cuối (chẳng hạn như ứng dụng yêu cầu vị trí con trỏ hoặc loại thiết bị đầu cuối hoặc tiêu đề cửa sổ), điều đó sẽ đi đến giám sát xtermcủa chúng tôi và xtermý chí của chúng tôi trả lời là tốt Chúng tôi không muốn một tiếng vang địa phương về điều đó.
Bạn cũng có thể theo dõi những gì đang được gõ bằng cách truy tìm các writecuộc gọi hệ thống đến cùng fd đó (thay thế readbằng writeở trên). Lưu ý rằng khi nhấn Enter, trình giả lập thiết bị đầu cuối sẽ gửi một ký tự CR, không phải là LF. Ngoài ra, vì chúng tôi đang theo dõi ở phía chính, nếu người dùng gõ a<Backspace>b, chúng tôi sẽ thấy tất cả 3 tổ hợp phím ngay cả khi thiết bị đầu cuối ở chế độ chính tắc.
Về lý do tại sao bạn không làm việc:
tee /dev/pts/user_pts </dev/pts/user_pts
Đọc từ thiết bị đầu cuối là đọc đầu vào của người dùng và viết cho thiết bị đó là để hiển thị cho người dùng.
Bạn đang nói teeđể đọc từ thiết bị đầu cuối. Vì vậy, những gì nó đọc (đầu vào của người dùng) sẽ không phải là read(các) ứng dụng đang chạy trong thiết bị đầu cuối (và ngược lại, teevà điều đó applicationsẽ chiến đấu cho đầu vào thiết bị đầu cuối). Viết cho thiết bị đầu cuối, là để hiển thị ở đó, nó không phải là để đặt nó trở lại đó làm đầu vào. Khi bạn làm
echo test
(với echothiết bị xuất chuẩn là thiết bị đầu cuối), nó không giống như khi bạn gõ test.
Có một ioctl( TIOCSTI) để đặt lại các ký tự làm đầu vào, nhưng ngay cả điều đó sẽ không thực sự hoạt động vì bạn có thể đặt lại sau ứng dụng như đã đọc thêm, vì vậy nó sẽ thay đổi thứ tự ứng dụng đang đọc đầu vào, và bằng mọi cách, điều đó có nghĩa là bạn sẽ đọc đi đọc lại.
ttysnoophoặc có thểpeekfd.