2009-08-01 15 views
75

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

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

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

Trả lời

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

này sẽ có thể đánh chặn các tín hiệu, nhưng chỉ như một bước trung gian trước khi JVM hoàn toàn ngưng hoạt động riêng của mình, vì vậy nó có thể không là những gì bạn đang tìm kiếm sau.

Bạn cần phải sử dụng một SignalHandler (sun.misc.SignalHandler) để đánh chặn các SIGINT tín hiệu kích hoạt bởi một Ctrl +C (trên Unix cũng như trên Windows).
Xem this article (pdf, trang 8 và 9).

+0

Liên kết đã chết ... –

+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

+0

@VonC - Lại chết – GurV

15

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à chính xác, thì bạn nên xem Shutdown Hooks.

+0

Không bao giờ nghe nói về móc tắt máy trước đây. Cảm ơn bạn! –

7

Để có thể xử lý Ctrl +C mà không cần tắt đối với một số lý do, bạn sẽ cần phải sử dụng một số hình thức tín hiệu xử lý (kể từ khi Ctrl +C đầu vào không phải là thực sự truyền trực tiếp cho ứng dụng của bạn, nhưng thay vì được xử lý bởi hệ điều hành mà tạo ra một SIGINT mà sau đó sẽ được chuyển cho 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 duyên dáng tắt máy, câu trả lời AKF sẽ đủ.)

4

Một số liên kết về làm thế nào để xử lý SIGTERM - đó là dấu hiệu của chương trình là nhận được ở phía bên OS:

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ẽ làm việc trên hành POSIX hệ thống - có nghĩa là, Mac và Unix sẽ hoạt động, trên các cửa sổ tôi không chắc chắn, tôi nhớ rằng nó cũng tương thích với POSIX ở một mức độ nào đó, nhưng có thể rất nhiều phiên bản.

+1

Liên kết thứ hai không thành công .Nó có thay đổi thành Oracle tại http://www.oracle.com/technetwork/java/javase/tsg-vm-149989.pdf không? – chance

+0

liên kết thứ ba cũng không thành công –