Theo kiến thức của tôi, /dev/pts
các tệp được tạo cho các phiên ssh hoặc telnet.
tty
.
Theo kiến thức của tôi, /dev/pts
các tệp được tạo cho các phiên ssh hoặc telnet.
tty
.
Câu trả lời:
Không có gì được lưu trữ trong /dev/pts
. Hệ thống tập tin này sống hoàn toàn trong bộ nhớ.
Các mục trong /dev/pts
là các thiết bị đầu cuối giả (viết tắt là pty). Hạt nhân Unix có một khái niệm chung về thiết bị đầu cuối . Thiết bị đầu cuối cung cấp một cách để các ứng dụng hiển thị đầu ra và nhận đầu vào thông qua thiết bị đầu cuối . Một quy trình có thể có một thiết bị đầu cuối kiểm soát - đối với ứng dụng chế độ văn bản, đây là cách nó tương tác với người dùng.
Thiết bị đầu cuối có thể là thiết bị đầu cuối phần cứng (tạm thời là tty, viết tắt của kiểu tel telpepe) hoặc thiết bị đầu cuối giả (Nhật ký pty). Thiết bị đầu cuối phần cứng được kết nối qua một số giao diện, chẳng hạn như cổng nối tiếp ( ttyS0
, ') hoặc USB ( ttyUSB0
,') hoặc qua màn hình PC và bàn phím ( tty1
,]). Thiết bị đầu cuối giả được cung cấp bởi một trình giả lập thiết bị đầu cuối, đây là một ứng dụng. Một số loại thiết bị đầu cuối giả là:
Nếu một chương trình mở một thiết bị đầu cuối để ghi, đầu ra từ chương trình đó xuất hiện trên thiết bị đầu cuối. Thông thường có một số chương trình xuất ra một thiết bị đầu cuối cùng một lúc, mặc dù điều này đôi khi có thể gây nhầm lẫn vì không có cách nào để biết phần nào của đầu ra đến từ chương trình nào. Các quy trình nền cố gắng ghi vào thiết bị đầu cuối kiểm soát của chúng có thể được tự động treo bằng tín hiệu SIGTTOU .
Nếu một chương trình mở một thiết bị đầu cuối để đọc, đầu vào từ người dùng được chuyển đến chương trình đó. Nếu nhiều chương trình đang đọc từ cùng một thiết bị đầu cuối, mỗi ký tự được định tuyến độc lập đến một trong các chương trình; Điều này không được khuyến khích. Thông thường chỉ có một chương trình duy nhất chủ động đọc từ thiết bị đầu cuối tại một thời điểm nhất định; các chương trình cố gắng đọc từ thiết bị đầu cuối kiểm soát của chúng trong khi chúng không ở phía trước sẽ tự động bị treo bởi tín hiệu SIGTTIN .
Để thử nghiệm, hãy chạy tty
trong một thiết bị đầu cuối để xem thiết bị đầu cuối là gì. Hãy nói điều đó /dev/pts/42
. Trong một vỏ trong một thiết bị đầu cuối khác, chạy echo hello >/dev/pts/42
: chuỗi hello
sẽ được hiển thị trên thiết bị đầu cuối khác. Bây giờ chạy cat /dev/pts/42
và gõ vào thiết bị đầu cuối khác. Để tắt cat
lệnh đó (sẽ làm cho thiết bị đầu cuối khác khó sử dụng), nhấn Ctrl+ C.
Viết thư cho thiết bị đầu cuối khác đôi khi hữu ích để hiển thị thông báo; ví dụ write
lệnh thực hiện điều đó Đọc từ một thiết bị đầu cuối khác thường không được thực hiện.
strace
đọc chương trình đầu vào, nhưng đó là nó.
tostop
cờ tty được đặt. Cờ này không được đặt theo mặc định. Và tôi đứng chính xác trên đọc từ anoter TTY. Tôi đã thử nó và nó hoạt động, nhưng nó trên cơ sở mỗi lần đọc, không phải trên cơ sở mỗi ký tự (khi ngồi tại dấu nhắc shell, chúng giống như shell đọc 1 ký tự một lần). Có thể tốt để làm rõ điểm này vì bây giờ tôi đã giải thích câu trả lời của bạn như thế nào.
read
cuộc gọi sẽ chỉ trả về các ký tự liên tiếp (hay đúng hơn là byte, tôi nên nói), nhưng ứng dụng không kiểm soát được bao nhiêu byte read
cuộc gọi sẽ trả về, vì vậy sẽ không tốt hơn.
Các tập tin trong /dev/pts
là "giả-ttys". Chúng giống như các đường ống được đặt tên ở một mức độ nào đó, nhưng chúng cũng bắt chước các thiết bị đầu cuối kết nối nối tiếp cũ, như VT-100. Pseudo-ttys thực hiện công việc chuyển byte từ bàn phím sang chương trình và từ chương trình sang thiết bị đầu ra, nghe có vẻ đơn giản. Nhưng điều đó trả lời câu hỏi khám phá của bạn: hạt nhân lưu trữ không có gì trong /dev/pts/0
ví dụ. Chỉ các luồng byte từ thiết bị xuất chuẩn của chương trình được kết nối với giả mã đi vào và các chương trình có stdin được kết nối với cùng giả đọc các byte đó.
Pseudo-ttys cũng đặt một lớp không xác định vào các luồng byte đó. Nhân có thể kiểm tra byte cho các giá trị đặc biệt như "Control-C" hoặc "Control-D" hoặc "Control-U" (tất cả đều có thể định cấu hình, xem man stty
) và gửi SIGINT, đặt cuối tệp trên stdin hoặc xóa một dòng trên đầu vào. Ngoài ra còn có một chức năng đệm ở đâu đó, vì vậy "cửa hàng không có gì" của tôi có phần sai, nhưng chỉ bằng một vài kilobyte.
Hạt nhân có thể kiểm tra các giá trị byte trên đầu ra và thực hiện những việc như biến một dòng mới (ASCII linefeed, LF hoặc "\n"
) thành hai byte, car-return-line và linefeed (CRLF hoặc "\r\n"
) hoặc bất kỳ byte nào mà phần cứng thiết bị đầu cuối nối tiếp yêu cầu. Sự gián tiếp của một giả cho phép độc lập với phần cứng.
Pseudo-ttys cũng cho phép tất cả "thiết lập tốc độ baud", "đặt chẵn lẻ" và ioctl()
các cuộc gọi hệ thống, và có lẽ không làm gì với chúng. Điều này cho phép các chương trình được viết lại vào thời của VT-100, ADM-3 và Wyse người tiếp tục làm việc mà không gặp lỗi. Phần mềm, trình điều khiển thiết bị giả, hoạt động như phần cứng.
Pseudo-tty có thể được sử dụng bởi sshd
và telnet
, nhưng chúng cũng được sử dụng giữa trình giả lập thiết bị đầu cuối (như xterm
hoặc rxvt
) và vỏ thường chạy bên trong xterm.
Linux và rất nhiều Unix có giả. Kế hoạch 9 thì không. Pseudo-ttys là một chút của một di tích, còn sót lại từ thời của các thiết bị đầu cuối phần cứng kết nối cáp nối tiếp.
/dev/
là một thư mục đặc biệt cho các tập tin thiết bị. Đây là những tóm tắt, chúng không phải là tập tin thực trên đĩa. Thư mục được điền khi khởi động và có thể thay đổi để phản ánh các giao diện thiết bị hiện có, được tạo và hủy bởi kernel và daemon không gian người dùng , udevd
.
Nhiều thiết bị được đại diện là ảo. Điều này bao gồm các mục trong /dev/pts
, đó là các thiết bị giao diện điều khiển. Đây là lý do tại sao một được tạo cho các phiên từ xa; chúng cũng được tạo khi bạn mở một thiết bị đầu cuối GUI cục bộ.
Bạn có thể mở chúng dưới dạng tệp, mặc dù nó không có giá trị sử dụng nhiều. Để có được /dev/pts
nút, vỏ của bạn được kết nối, sử dụng tty
:
> tty
/dev/pts/4
Bây giờ chuyển sang một số giao diện điều khiển khác và thử:
> echo "duck!" > /dev/pts/4
Tài giỏi. Bây giờ cố gắng:
> cat /dev/pts/4
Sau đó thử và sử dụng shell tại / dev / pts / 4. Bạn bị mắc kẹt cho đến khi bạn thoát khỏi cat
phía bên kia, nhưng hầu hết những gì bạn gõ trên pts / 4 sẽ đi qua (ví dụ: thử "hello world" tôi đã kết thúc với hl
pts / 4 và ello word
trên cat
bảng điều khiển).
Tôi đoán ở đây là thiết bị lấy đầu vào từ vỏ và xuất nó qua hệ thống, đó là cách mọi thứ kết thúc trên màn hình - vỏ không xử lý phần cứng, hệ thống. Hãy thử strace bash
(và xem man strace
thử nếu bạn không biết nó là gì); bạn nhận được một loạt các cuộc gọi sơ bộ khi bash bắt đầu. Bây giờ bắt đầu nhấn phím:
read(0, "h", 1) = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "h", 1h) = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
read(0, "e", 1) = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "e", 1e) = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
read(0, "y", 1) = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "y", 1y) = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
Đối với mỗi chữ cái được gõ, có một lần đọc từ đầu vào tiêu chuẩn và viết ra tiêu chuẩn. Nhưng những gì tiêu chuẩn của vỏ kết nối với? Bây giờ hãy thử strace
trên thiết bị đầu cuối GUI của bạn - tôi sẽ phải tìm ra tên nếu bạn không biết tên đó, ví dụ như trên KDE konsole
, và Gnome có gnome-terminal
, tôi tin rằng. Đầu ra từ đó strace
có lẽ khó hiểu hơn - của tôi có rất nhiều poll()
và recvfrom()
. Tôi không thấy bất kỳ ghi nào, nhưng nếu bây giờ bạn rút được cat
mẹo từ thiết bị đầu cuối khác, bạn sẽ nhận thấy khi bạn nhập, các nét chính được đọc bởi mèo sẽ không có phản hồi nào trong đầu ra strace - thiết bị đầu cuối không ' t nhận chúng. Vì vậy, ứng dụng thiết bị đầu cuối GUI và con mèo đang cạnh tranh để đọc từ cùng một thiết bị mà vỏ được xuất ra.
echo Hello > /dev/pts/1
... Xem những gì xảy ra, đó là thiết bị đầu cuối của bạn.