Phần ma thuật ở đây mà bạn dường như không nhận thức được là lớp tty của hạt nhân.
Mỗi cửa sổ đầu cuối bạn mở tương ứng với pseudoterminal device - ví dụ: /dev/ttys001
là tên cho một thiết bị như vậy trên Mac OS X. Theo mặc định, mọi quy trình đang chạy trong thiết bị đầu cuối và không có đầu vào/đầu ra chuyển hướng từ/đến một nơi khác, đầu vào, đầu ra và lỗi chuẩn của nó đều được đặt thành một trong các thiết bị này. Ví dụ, nếu tôi chạy lsof
trên một quá trình cat
chạy trong một thiết bị đầu cuối, tôi thấy:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
...
cat 52919 user 0u CHR 16,5 0t4562 3313 /dev/ttys005
cat 52919 user 1u CHR 16,5 0t4562 3313 /dev/ttys005
cat 52919 user 2u CHR 16,5 0t4562 3313 /dev/ttys005
Khi một quá trình ghi vào một thiết bị nô lệ pseudoterminal, sản lượng được định tuyến đến quá trình tổ chức vào cuối bậc thầy của các kết nối (trong trường hợp này, ứng dụng đầu cuối của bạn), có thể đọc nó. Tương tự, khi một ứng dụng đầu cuối ghi vào một thiết bị tổng thể giả, dữ liệu sẽ có sẵn cho bất kỳ quá trình nào đang đọc từ thiết bị nô lệ tương ứng.
Có một vài thủ thuật khác liên quan đến thiết bị giả. Đáng chú ý nhất, chúng có kích thước cố định trong các hàng và cột, một ứng dụng chạy trong chúng có thể truy vấn, chúng có thể thực hiện một số bản dịch đơn giản nhất trên dữ liệu đi qua chúng (ví dụ CR đến CR/LF, backspace to DEL, và mọi thứ) và họ có thể tạo ra tín hiệu khi một số ký tự được nhìn thấy (e.g, Ctrl - C tạo tín hiệu ngắt cho quy trình nền trước). Có rất nhiều sự tinh tế lịch sử kỳ lạ ở đây, nhưng vấn đề là lớp tty của hạt nhân là nơi mà hầu hết hành vi này tồn tại.
Thiết bị giả tạo được tạo bằng chức năng libc forkpty()
. Các chi tiết về cách thức hoạt động của cảnh hậu trường này thay đổi từ nền tảng đến nền tảng và có thể có nhiều lông, vì vậy tôi sẽ không tìm hiểu chi tiết.
Thiên tài (?) Của Unix là mọi thứ đều là tệp, Thiết bị và tất cả. –
Stdout là bộ mô tả tập tin 1. Stdin là số không, stderr là 2 –