Những gì được lưu trữ trong tập tin / dev / pts và chúng ta có thể mở chúng không?


73

Theo kiến ​​thức của tôi, /dev/ptscác tệp được tạo cho các phiên ssh hoặc telnet.


6
echo Hello > /dev/pts/1... Xem những gì xảy ra, đó là thiết bị đầu cuối của bạn.
Sepahrad Salour


1
@SepahradSalour người ta phải điều chỉnh số pts với bối cảnh của nó. sshd của tôi đã sử dụng / dev / pts / 30 cho phiên của tôi.
Gab 是

2
@Gab Để có được vị trí của thiết bị đầu cuối hiện tại của bạn, bạn có thể sử dụng lệnh tty.
JeromeJ

Câu trả lời:


110

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/ptscá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à:

  • Các ứng dụng GUI như xterm, gnome-terminal, konsole, biến đổi các sự kiện bàn phím và chuột thành kiểu nhập văn bản và hiển thị đầu ra bằng đồ họa ở một số phông chữ.
  • Các ứng dụng ghép kênh như đầu vào và đầu ra rơle màn hình và tmux từ và đến một thiết bị đầu cuối khác, để tách các ứng dụng chế độ văn bản khỏi thiết bị đầu cuối thực tế.
  • Các ứng dụng shell từ xa như sshd, telnetd, rlogind, đầu vào và đầu ra rơle giữa một thiết bị đầu cuối từ xa trên máy khách và pty trên máy chủ.

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 ttytrong 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 hellosẽ được hiển thị trên thiết bị đầu cuối khác. Bây giờ chạy cat /dev/pts/42và gõ vào thiết bị đầu cuối khác. Để tắt catlệ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ụ writelệ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.


Hoặc tôi đang hiểu sai những gì bạn đang cố nói, hoặc thông tin của bạn bị tắt. Các quy trình nền được ghi vào thiết bị đầu cuối sẽ không dẫn đến SIGTTIN. Cũng không thể đọc nhiều chương trình từ thiết bị đầu cuối cùng một lúc (tuyên bố của bạn rằng "mỗi ký tự được định tuyến độc lập"). Chỉ có một chương trình có thể đọc từ thiết bị đầu cuối bất cứ lúc nào và một chương trình nền để đọc từ thiết bị đầu cuối đó sẽ dẫn đến SIGTTIN. Đó là trường hợp duy nhất mà SIGTTIN được tự động gửi.
Patrick

Ngoài ra, bạn cũng không thể đọc từ thiết bị đầu cuối khác. Làm như vậy sẽ là một lỗ hổng bảo mật đáng kể vì bạn có thể chặn dữ liệu. Bạn có thể straceđọc chương trình đầu vào, nhưng đó là nó.
Patrick

4
@Patrick Nền xử lý ghi vào thiết bị đầu cuối nhận SIGTTOU, đó là một lỗi đánh máy. Nhiều chương trình có thể đọc từ thiết bị đầu cuối cùng một lúc (thử và xem, cách tôi mô tả trong đoạn tiếp theo; bạn phải thực hiện nó từ một quy trình có thiết bị đầu cuối kiểm soát không phải là thiết bị đầu cuối đó). Vâng, bạn có thể đọc từ một thiết bị đầu cuối khác, miễn là nó thuộc về bạn - tại sao bạn nghĩ rằng điều đó là không thể?
Gilles

Quá trình nền ghi vào thiết bị đầu cuối chỉ nhận SIGTTOU nếu tostopcờ 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.
Patrick

2
@Patrick Chắc chắn, một readcuộ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 readcuộc gọi sẽ trả về, vì vậy sẽ không tốt hơn.
Gilles

18

Các tập tin trong /dev/ptslà "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/0ví 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 sshdtelnet, nhưng chúng cũng được sử dụng giữa trình giả lập thiết bị đầu cuối (như xtermhoặ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.


13

/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/ptsnú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 catphí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 hlpts / 4 và ello wordtrên catbả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 stracethử 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ử stracetrê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ừ đó stracecó lẽ khó hiểu hơn - của tôi có rất nhiều poll()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 catmẹ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.


việc sử dụng 'cat / dev / pts / 4' là gì khi chúng ta bị mắc kẹt và tại sao chúng ta bị mắc kẹt trong khi thực hiện lệnh này.
dùng2720323

Tôi đã thêm một vài đoạn để thử và giải thích điều này.
goldilocks
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.