Ngăn chặn lệnh dừng khi nhấn CTRL + C


28

Vì vậy, tôi đã chơi một số Zork 1 và tôi đã đi sao chép một số văn bản để hiển thị một người bạn của tôi, nhưng tôi vô tình quên giữ phím shift khi nhấn CTRL+ C. Điều này đã dừng lệnh và tôi đã mất dữ liệu Zork của mình ...

Có một số mẹo "hữu ích" mà chúng có thể sử dụng để ngăn chặn lệnh khi nhấn phím CTRL+ C?

Lưu ý rằng Zork được chạy bên trong thiết bị đầu cuối. Đây là một trò chơi dựa trên thiết bị đầu cuối trong đó bạn đưa ra các lệnh để thực hiện các hành động khác nhau.


Vì vậy, bạn muốn Ctrl + c để ngăn chặn hoàn toàn tất cả các ứng dụng? Điều đó có thể là thảm họa trong tương lai.
ngày

Câu trả lời:


30

Tổ hợp phím Ctrl+ Cgửi ký tự ^C(giá trị byte 3). Điều này khiến thiết bị đầu cuối gửi tín hiệu SIGINT đến chương trình đang chạy ở nền trước¹. Hành động thông thường cho tín hiệu này là làm gián đoạn lệnh hiện tại: các chương trình được thiết kế để xử lý các lệnh liên tiếp quay lại dấu nhắc toplevel của chúng, trong khi các chương trình được thiết kế dưới dạng một lệnh bó hoặc thoát tương tác liên tục. Rõ ràng chương trình bạn đang sử dụng được thiết kế theo mô hình thứ hai.

Khóa gửi tín hiệu này là một tính năng của giao diện thiết bị đầu cuối chung trong kernel, được chia sẻ bởi tất cả các trình giả lập thiết bị đầu cuối và thiết bị đầu cuối vật lý thực. Bạn có thể định cấu hình phím nào gửi tín hiệu này, cũng như các phím khác (đáng chú ý nhất là CtrlZgửi SIGSTOP để tạm dừng chương trình nền trước) bằng sttylệnh. Để chuyển khóa cho SIGINT thành Ctrl+ _(trong thiết bị đầu cuối hiện tại):

stty intr '^_'

Để vô hiệu hóa nó hoàn toàn:

stty intr ''

Để đặt lại tất cả các cài đặt về mặc định:

stty sane

Khóa không thể là tổ hợp khóa tùy ý, nó phải là một giá trị byte đơn. Các sttythiết lập có thể được ghi đè bởi các chương trình - một số chương trình (đặc biệt là các chương trình chế độ văn bản toàn màn hình) làm chế biến phím tắt riêng của họ.

¹ Chính xác hơn , cho tất cả các quá trình trong foreground nhóm quá trình mà các thiết bị đầu cuối là các thiết bị đầu cuối kiểm soát .


32

CTRL+ Cgửi tín hiệu ngắt ( SIGINT, là tín hiệu số 2) đến công việc ở phía trước. Bạn có thể vô hiệu hóa điều này bằng cách "bẫy" tín hiệu bằng trap '' 2lệnh trước khi khởi động Zork.

Kích hoạt lại CTRL+ C(mở khóa SIGINT) với trap 2.

Mẹo : bạn có thể thêm một cái gì đó như thế này vào ~/.bashrc:

alias zork="(trap '' 2 && cd ~/path/to/zork/ && frotz ZORK1.DAT)"

Bằng cách này, bạn sẽ không bao giờ quên tắt và bật lại tín hiệu và dễ dàng bắt đầu trò chơi hơn bằng cách chỉ cần nhập zorkvào thiết bị đầu cuối.

Lưu ý : bạn có thể sử dụng tên tín hiệu thay vì số nếu thuận tiện hơn cho bạn, tức là trap '' siginthoặc trap '' int. Tôi chỉ quen với việc sử dụng các số, ví dụ như trong kill -9và như vậy.

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.