2013-04-10 37 views
7

Tôi có một câu hỏi chung về cách thiết bị đầu cuối và quy trình hoạt động.Terminal đọc từ stdout như thế nào và vẽ văn bản trên màn hình?

Từ bất kỳ quy trình nào, nếu tôi viết tới stdout (tức là bộ mô tả tập tin 2), nó sẽ được vẽ trên cửa sổ đầu cuối. Câu hỏi của tôi là, điều này thực sự được triển khai như thế nào? Là stdout một thực tế 'giả' tập tin một nơi nào đó mà các thiết bị đầu cuối tiếp tục đọc từ và vẽ nội dung trên màn hình? Hoặc là có một số loại IPC giữa quá trình/dòng stdout và Terminal?

Lưu ý rằng khi tôi nói thiết bị đầu cuối, tôi có nghĩa là một số thiết bị đầu cuối GUI/bàn điều khiển chung, chẳng hạn như Thiết bị đầu cuối trên máy Mac.

P.S. Nếu câu hỏi này không rõ ràng, hãy cho tôi biết và tôi sẽ vui vẻ cố giải thích lần nữa :)

Cảm ơn!

+2

Thiên tài (?) Của Unix là mọi thứ đều là tệp, Thiết bị và tất cả. –

+0

Stdout là bộ mô tả tập tin 1. Stdin là số không, stderr là 2 –

Trả lời

3

Khi bạn bao gồm stdio.h, stdout là một biến được xác định tại đó.

Để báo Wikipedia

stdout - một con trỏ đến một FILE trong đó đề cập đến dòng đầu ra tiêu chuẩn, thường là một thiết bị đầu cuối hiển thị

Và, như Russ C đã đề cập, tất cả mọi thứ là một tập tin trong Unix, vì vậy bạn có quyền trong sự tôn trọng đó.

apparently, mỗi chương trình unix được mở có đầu ra, đầu vào và luồng lỗi được đặt theo mặc định, tương ứng với stdout, stdin và stderr. Họ có thể được thay đổi, mặc dù. Giống như trong thiết bị đầu cuối, nơi bạn redirect đầu vào tiêu chuẩn của một tập tin bằng cách sử dụng '<', mà bạn có thể làm gì trong những câu như

mysql -u root -p dbname < ./data.sql 

Tôi đoán điều này không thực sự trả lời tất cả các câu hỏi của bạn về các chi tiết thực sự của thực hiện, nhưng biết rằng đó là luồng tệp có thể cung cấp cho bạn ý tưởng hay về những gì đang xảy ra.

3

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.

+0

Xem 'man stty' cho cách các terminal có thể được điều khiển –

1

Đây là hình ảnh lớn.

  1. Thiết bị đầu cuối là thiết bị. Đó là một phần của phần cứng, và bạn có thể làm cho mọi thứ xuất hiện trên nó bằng cách ghi dữ liệu vào giao diện phần cứng của nó.
  2. Hệ điều hành ủy quyền xử lý việc này (và bất kỳ thiết bị phần cứng nào) cho trình điều khiển thiết bị. Trình điều khiển thiết bị về cơ bản cung cấp giao diện phần mềm cho thiết bị. Sau đó bạn có thể làm cho mọi thứ xuất hiện trên thiết bị đầu cuối bằng cách gọi giao diện phần mềm trình điều khiển thiết bị này.
  3. Trong hệ thống * nix, trình điều khiển thiết bị hiển thị các thiết bị phần cứng mà chúng kiểm soát dưới dạng tệp trong hệ thống tệp. Bạn có thể mở các tệp này và gọi giao diện phần mềm do trình điều khiển thiết bị cung cấp (thông qua mở, ioctl, đóng, v.v.).
  4. Thư viện C có hệ thống I/O lớp bên dưới mở các tệp này và gọi giao diện trình điều khiển thiết bị thay cho bạn. Bạn cũng có thể tự mình làm điều đó, nhưng chỉ biết rằng bất kỳ chức năng thư viện nào bạn sử dụng cũng đang làm điều này.
  5. Theo mặc định, khi quá trình được tạo, các bộ mô tả 0 và 1 được mở trên thiết bị đầu cuối. Vì vậy, khi bạn viết cho các bộ mô tả này, trình điều khiển cơ bản sẽ nhận dữ liệu và nói chuyện với thiết bị phần cứng để hiển thị các ký tự trên màn hình.
  6. Khi bạn đặt đầu ra của quy trình cho một quy trình khác hoặc chuyển hướng đầu ra đến tệp, các bộ mô tả được mở lại trên các thiết bị khác như đường ống hoặc tệp và dữ liệu bạn viết cho chúng sẽ kết thúc trình điều khiển thiết bị và cuối cùng là thiết bị phần cứng.
+0

Cảm ơn bạn đã trả lời câu trả lời này. – user1717828

Các vấn đề liên quan