Làm cách nào để “chặn” Ctrl + C trong ứng dụng CLI?


85

Làm cách nào tôi có thể chặn Ctrl + C(thường sẽ giết quá trình) trong ứng dụng Java CLI (giao diện dòng lệnh)?

Có tồn tại giải pháp đa nền tảng (Linux, Solaris, Windows) không?

Tôi đang sử dụng Console's readLine(), nhưng nếu cần, tôi có thể sử dụng một số phương pháp khác để đọc các ký tự từ đầu vào chuẩn.

Câu trả lời:


121
Runtime.getRuntime().addShutdownHook(new Thread() {
    public void run() { /*
       my shutdown code here
    */ }
 });

Điều này sẽ có thể chặn tín hiệu, nhưng chỉ là bước trung gian trước khi JVM tự tắt hoàn toàn, vì vậy nó có thể không phải là thứ bạn đang quan tâm.

Bạn cần sử dụng dấu SignalHandler( sun.misc.SignalHandler) để chặn SIGINTtín hiệu được kích hoạt bởi dấu Ctrl+ C(trên Unix cũng như trên Windows).
Xem bài viết này (pdf, trang 8 và 9).


5
@MartijnCourteaux Điều đó xảy ra sau năm năm;) Tôi đã tìm thấy một nguồn tương tự về chủ đề đó và đã thay đổi liên kết cho phù hợp.
VonC

@VonC - Đó là Chết một lần nữa
Gurwinder Singh

@GurV Liên kết nào? Tóm lược sửa đổi tôi đã thực hiện trong tháng Tư năm 2014 ( stackoverflow.com/revisions/... ) vẫn còn hiệu lực: bạn vẫn có thể tải về các tập tin pdf ..
VonC

16

Tôi giả sử bạn muốn tắt máy một cách duyên dáng và không làm ngắn mạch quá trình tắt máy. Nếu giả định của tôi là đúng, thì bạn nên xem Shutdown Hooks .


Chưa bao giờ nghe nói về móc tắt máy trước đây. Cảm ơn bạn!
ivan_ivanovich_ivanoff

8

Để có thể xử lý Ctrl+ Cmà không bị tắt vì lý do nào đó, bạn sẽ cần sử dụng một số hình thức xử lý tín hiệu (vì Ctrl+ Cđầu vào không thực sự được chuyển trực tiếp đến ứng dụng của bạn mà thay vào đó được xử lý bởi hệ điều hành tạo ra một SIGINT sau đó được chuyển sang Java.

Xem http://www.oracle.com/technetwork/java/javase/signals-139944.html để biết chi tiết về xử lý tín hiệu.

(Nếu bạn chỉ muốn tắt máy một cách duyên dáng, câu trả lời của akf là đủ.)


4

Một số liên kết về cách xử lý SIGTERM - đó là tín hiệu mà chương trình đang nhận được ở phía hệ điều hành:

http://blog.webinf.info/2008/08/intercepting-sigterm.html

http://java.sun.com/javase/6/webnotes/trouble/TSG-VM/html/signals.html

http://www.ibm.com/developerworks/java/library/i-signalhandling/

Điều đó sẽ hoạt động trên hệ điều hành POSIX - tức là Mac và Unix sẽ hoạt động, trên windows, tôi không chắc lắm, tôi nhớ đã nghe nói nó cũng tương thích với POSIX ở một mức độ nào đó, nhưng có thể bị hỏng nhiều với các phiên bản khác nhau.


1
Liên kết thứ hai không thành công. Nó có được đổi thành Oracle tại oracle.com/technetwork/java/javase/tsg-vm-149989.pdf không?
cơ hội

liên kết thứ ba cũng không
Hugo Zaragoza
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.