Ai quyết định ứng dụng nào nhận được tín hiệu từ bàn phím?


16

Sự hiểu biết hiện tại của tôi về các tín hiệu từ bàn phím trong thiết bị đầu cuối là (chủ yếu dựa vào việc cố gắng ánh xạ các quan sát của tôi đến những gì có thể tìm thấy trên google) sau đây:

  • Người dùng nhấn Cc
  • Điều này được gửi đến bộ đệm đầu vào của thiết bị đầu cuối dưới dạng một byte được tính bằng cách xóa 2 bit ngoài cùng bên trái khỏi giá trị ascii 7 bit của c

Sau đó, nó bắt đầu thực sự mờ, bởi vì cấu hình đầu vào có nghĩa là tín hiệu nào được thực hiện trong thiết bị đầu cuối (stty). Tôi cho rằng nó có nghĩa là chính thiết bị đầu cuối đang gửi tín hiệu đến quá trình. Nhưng tôi cũng mặc dù thiết bị đầu cuối đó không biết về ứng dụng đang đọc nó.

Làm thế nào để gửi tín hiệu bằng bàn phím trong thiết bị đầu cuối hoạt động từ đầu đến cuối?


1
Không phải là một câu trả lời riêng, nhưng đáng đọc: TTY bị phá hủy , bởi lft.
duskwuff

Câu trả lời:


33

Nhấn Cwhile Ctrlđược nhấn sẽ gửi một phím nhấn theo sau là sự kiện X11 keyrelease đến trình giả lập thiết bị đầu cuối.

Khi sự kiện đó (thường là nhấn phím), trình giả lập thiết bị đầu cuối ghi byte 0x3 ( ^C) vào bộ mô tả tệp của nó ở phía chính của thiết bị giả.

Nếu isigcài đặt termios của thiết bị được bật và nếu intrcài đặt được đặt thành byte 0x3 đó, thì kernel sẽ gửi tín hiệu SIGINT cho tất cả các thành viên của nhóm quy trình nền trước của thiết bị đầu cuối (một thuộc tính khác được lưu trữ trong thiết bị pty). Trong trường hợp đó, byte 0x3 sẽ không có sẵn để đọc ở phía nô lệ của pty.

Nó thường là các shell tương tác tạo ra các nhóm quy trình (với setpgid()) cho các công việc shell và quyết định nên đặt cái nào ở phía trước ( tcsetpgrp()để đặt thuộc tính đó của thiết bị pty) hay không.

Chẳng hạn, khi bạn chạy ở dấu nhắc của trình bao tương tác:

foo | bar

Shell bắt đầu một nhóm quy trình mới với hai quy trình (trong đó nó thực thi foobarsau khi đã kết nối stdin / out của chúng với một đường ống) và đặt nhóm đó ở phía trước. Cả hai quá trình sẽ nhận được SIGINT nếu bạn nhấn Ctrl-C.

Trong:

foo | bar &

Tương tự nhưng nhóm quy trình không được đặt ở phía trước (và trình bao cũng không chờ nó để bạn có thể nhập các lệnh khác). Các quy trình đó sẽ không nhận được SIGINT trên Ctrl-C nhưng có thể bị treo nếu họ cố đọc từ thiết bị tty.

Đọc thêm tại: Trách nhiệm của từng thành phần Pseudo-Terminal (PTY) (phần mềm, phía chủ, bên nô lệ) là gì?


2
Cảm ơn câu trả lời phong phú. Tôi sẽ cố gắng viết lại cốt lõi của câu trả lời để chắc chắn rằng tôi hiểu nó: Tín hiệu được gửi bởi kernel, người đang theo dõi chính thiết bị tty cho đầu vào được cấu hình trong các thuộc tính của thiết bị (bởi bất kỳ ai muốn định cấu hình nó) và hạt nhân gửi nó đến nhóm quy trình cũng được cấu hình trong các thuộc tính của thiết bị (chủ yếu bằng shell là một trong những nhiệm vụ của người lãnh đạo phiên). Tôi hy vọng điều này là chính xác.
calavera.info

1
@ calavera.info, đúng vậy. Trong trường hợp thiết bị đầu cuối thực sự ở cuối cáp nối tiếp, hạt nhân đang tìm kiếm byte 0x3 đó đến từ dây. Đối với thiết bị đầu cuối giả, phía chủ thay thế dây. Và hạt nhân đang tìm kiếm byte 0x3 đó trong các byte được gửi bởi trình giả lập đầu cuối. Xem thêm phần chỉnh sửa với một liên kết đến một câu hỏi và trả lời khác với nhiều chi tiết hơn (như thực tế rằng việc xử lý hạt nhân là một phần của thiết kế mô-đun được thực hiện khi thiết bị được sử dụng như một thiết bị "đầu cuối" ( kỷ luật dòng đầu cuối ).
Stéphane Chazelas

Không phải câu hỏi nói thiết bị đầu cuối , chứ không phải là trình giả lập thiết bị đầu cuối ? Tôi không cho rằng nó có nhiều khác biệt, vì chức năng của trình giả lập là hoạt động giống như một thiết bị đầu cuối nhất có thể ...
Toby Speight

2
@Toby, vâng, vì hầu như không có ai sử dụng thiết bị đầu cuối thực sự ngày nay, tôi giả sử OP có nghĩa là trình giả lập thiết bị đầu cuối (nhiều trong số chúng được gọi là "thiết bị đầu cuối"). Xem thêm nhận xét của tôi ở trên của bạn và hỏi đáp được liên kết để biết thêm chi tiết.
Stéphane Chazelas

1
@TobySpeight Vâng, tôi đã hỏi về một thiết bị đầu cuối bởi vì tôi đang xử lý thiết bị đầu cuối thực sự qua dòng nối tiếp, nhưng câu trả lời và nhận xét sau đây là hoàn toàn hợp lệ cho cả hai trường hợp.
calavera.info
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.