Tại sao bàn điều khiển đôi khi cần thiết lập lại sau CTRL + C


9

Một số công cụ giao diện dòng lệnh trả về một giao diện điều khiển bị hỏng khi bị hủy bởi CTRL+C. Đôi khi văn bản là vô hình, hoặc có vấn đề đồ họa cho đến khi tôi chạy lệnh reset.

(Tôi sử dụng bash, nhưng hy vọng nó độc lập với shell.)

Liệu hiệu ứng này có một tên? Điều gì gây ra điều này, và làm thế nào các lập trình viên có thể ngăn chặn điều này trong các công cụ? Có một chiến lược làm thế nào vấn đề này được giải quyết trong các ngôn ngữ lập trình chính?



stty sanecho bộ râu màu xám
Thorbjørn Ravn Andersen

Câu trả lời:


14

Bàn điều khiển đôi khi cần một reset(1) (hoặc một số stty(1)lệnh) vì trạng thái của thiết bị đầu cuối giả không thay đổi khi một quá trình (ví dụ: chương trình được khởi động bởi trình bao của bạn) chấm dứt.

Đọc tty làm sáng tỏ .

(Tôi thấy việc xử lý các thiết bị đầu cuối giả và giả là phần khó nhất của Linux)

Có một chiến lược làm thế nào vấn đề này được giải quyết trong các ngôn ngữ lập trình chính?

Một chương trình hoạt động tốt xử lý thiết bị đầu cuối và thay đổi chế độ hoặc kỷ luật đường truyền của nó nên cố gắng hết sức để tránh sự cố và đưa ra các cuộc gọi thích hợp (xem thuật ngữ (3) ) để đặt thiết bị đầu cuối ở trạng thái phù hợp. BTW, các thư viện như ncurses hoặc readline đều hữu ích (nhưng bạn cần gọi các thói quen dọn dẹp của chúng một cách thích hợp).

Xem tín hiệu (7)an toàn tín hiệu (7) . Tránh sự cố trong mã của bạn là khó khăn. Đọc về hành vi không xác định .

Một cách giải quyết không hoàn hảo có thể là xác định hàm shell chạy chương trình của bạn sau đó thực hiện reset(đôi khi có thể không phù hợp).


Cách giải quyết đó không tuyệt vời; đôi khi resetcó thể dẫn đến các sttycài đặt khác nhau từ những cái ban đầu.
Bob

Vâng, cảm ơn đã chỉ ra rằng. Tôi đã thêm "không hoàn hảo".
Basile Starynkevitch

Tôi đã đọc các liên kết của bạn, chúng rất thú vị, nhưng sẽ rất hữu ích, nếu bạn có thể thêm một con trỏ vào một phần cho Q / A này. Sau khi đọc tty demystized, tôi bắt đầu stty -a > /tmp/test1trong bash sau đó một lệnh, mà tôi đã hủy bỏ. Màu thiết bị đầu cuối bây giờ là màu đỏ. stty -a > /tmp/test2nhưng test1test2hoàn toàn giống nhau
Jonas Stein

1

Ứng phó với vấn đề này không hoàn toàn độc lập với vỏ. Trong zsh, có tích hợp ttyctlsẵn, có thể "đóng băng" hoặc "giải phóng" chế độ tty. Tôi không nghĩ rằng có một tương đương trong bash. Các settylệnh trong tcsh làm điều tương tự, nhưng nhiều hạt mịn: bạn có thể đóng băng các thiết lập cá nhân.

Đóng băng chế độ tty chỉ có nghĩa là zsh sẽ nhớ chế độ hiện tại và nếu một số đứa trẻ trong tương lai thay đổi nó, chế độ sẽ được khôi phục khi đứa trẻ tạm ngưng hoặc chấm dứt.

Điều này sẽ bảo vệ bạn khỏi một số tác động xấu của các chương trình bị sập hoặc nếu không làm sạch thiết bị đầu cuối. Bạn phải nhớ để giải phóng nếu bạn muốn thực hiện thay đổi stty, nếu không, vỏ sẽ ngay lập tức hoàn tác bất cứ điều gì bạn sttyđã làm.

resetthực hiện nhiều hơn sttycác chế độ khôi phục , vì vậy đôi khi bạn vẫn có thể cần nó, nhưng không thường xuyên.


Thật vậy: Tôi đã bắt đầu stty -a> / tmp / test1 trong bash rồi một lệnh mà tôi đã hủy. Màu thiết bị đầu cuối bây giờ là màu đỏ. stty -a> / tmp / test2 nhưng test1 và test2 hoàn toàn giống nhau. Tôi đã thử tương tự với tcsh, nhưng tôi không thể phá vỡ lệnh của mình bằng CTRL + C. Các màu sắc vẫn tốt.
Jonas Stein
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.