Điều này khó hơn bạn nghĩ.
Bạn cần hiểu cách thiết bị đầu cuối hoạt động - chúng sử dụng chuỗi điều khiển đặc biệt cho ví dụ: di chuyển con trỏ hoặc đầu ra màu. Điều này được mô tả bằng một tệp tin terminfo dành riêng cho thiết bị đầu cuối. Ncurses
dịch các cuộc gọi API (ví dụ: di chuyển con trỏ đến một vị trí nhất định) đến các chuỗi điều khiển như vậy bằng cách sử dụng terminfo.
Kể từ khi thiết bị đầu cuối (ngày nay xterm
, gnome-terminal
, screen
, tmux
, vv) là ở phía khách hàng, bạn phải vượt qua các loại thiết bị đầu cuối từ máy khách đến máy chủ. Đó là lý do tại sao ví dụ ssh
chuyển thông tin này từ máy khách ssh đến máy chủ (thử echo $TERM
trong phiên ssh của bạn - có thể là 'linux' nếu bạn đăng nhập qua bảng điều khiển hoặc 'xterm', nếu bạn đang sử dụng X và xterm). Ngoài ra, bạn tốt hơn có terminfo tương ứng có sẵn trên máy chủ.
Một phần khác của câu đố là thiết bị đầu cuối giả. Vì ngày nay tương đối ít người sử dụng thiết bị đầu cuối nối tiếp, ngữ nghĩa của chúng được mô phỏng để các ứng dụng và thư viện (ví dụ: curses
và bạn bè của nó) được phát triển ban đầu cho bộ điều khiển nối tiếp tiếp tục hoạt động. Điều này đạt được thông qua các thiết bị đầu cuối giả - chúng giống như các đường ống, một thiết bị chủ và một thiết bị nô lệ giao tiếp, bất cứ thứ gì được viết trên một mặt đều xuất hiện ở phía bên kia. Ví dụ: đối với quy trình đăng nhập, getty
chỉ có thể sử dụng một mặt của thiết bị pty và coi đó là dòng nối tiếp - chương trình máy chủ phải xử lý mặt khác của pty, gửi mọi thứ từ pty đến máy khách của bạn thông qua mạng.
ga giả lập cũng sử dụng ptys, gõ tty
vào thiết bị đầu cuối của bạn, và bạn sẽ nhận được một cái gì đó giống như /dev/pts/9
nếu bạn đang sử dụng một mô phỏng thiết bị. Ở phía bên kia của pty nó thường là shell của bạn, giao tiếp với trình mô phỏng thiết bị đầu cuối của bạn thông qua pty.
Chương trình khách hàng của bạn có thể nhiều hơn hoặc ít hơn chỉ sử dụng đầu vào tiêu chuẩn và đầu ra tiêu chuẩn. Nếu thông tin thiết bị đầu cuối của bạn là chính xác, phần còn lại sẽ được xử lý bởi trình giả lập thiết bị đầu cuối của bạn, chỉ cần chuyển bất kỳ thứ gì bạn nhận được từ chương trình máy chủ của bạn tới stdout
và gửi bất cứ điều gì bạn đọc từ stdin
đến chương trình máy chủ của bạn.
Hy vọng rằng tôi chưa bỏ sót bất kỳ chi tiết quan trọng nào. Chúc may mắn!