2012-03-14 27 views
5

Theo chủ đề, có cách nào để tắt CTRL-C (và các tín hiệu khác) để chúng không chấm dứt ứng dụng không?Java: Có thể tắt Ctrl-C trong ứng dụng bảng điều khiển Java không?

+2

bản sao có thể có của [Tín hiệu xử lý trong Máy ảo Java] (http://stackoverflow.com/questions/40376/handle-signals-in-the-java-virtual-machine) –

+2

Bạn có thể tắt một số tín hiệu nhưng không phải tất cả 'kill -9';) –

+0

@Johan Bài viết đó giải thích một số khó khăn mà tôi đang gặp phải. Cụ thể hơn, có vẻ như JVM chặn các tín hiệu gọi các móc tắt (được đăng ký qua Runtime.addShutdownHook) trước khi kết thúc. Tuy nhiên nó dường như không mô tả làm thế nào/nếu nó có thể * vô hiệu hóa * tín hiệu (hoặc ít nhất là ngăn chặn chúng từ chấm dứt ứng dụng). –

Trả lời

5

EDIT2: điều này cũng có thể giúp: Capture SIGINT in Java

Thisthis dường như những gì bạn muốn.

Ctrl-C và lệnh khác gửi "tín hiệu" cho chương trình của bạn và nếu bạn viết mã để "bắt" nắm bắt những tín hiệu đó, bạn có thể thay đổi cách chương trình phản ứng. Lý tưởng nhất, bạn sẽ muốn ctrl-c chấm dứt chương trình, vì nó là những gì người dùng mong đợi, vì vậy hãy nhớ rằng bạn nên nói cho người dùng biết tại sao nó không kết thúc nếu bạn thay đổi phản hồi của chương trình.

Edit3: Đề nghị của một người chơi chìa khóa cho mèo là lần đặt cược tốt nhất tiếp theo của bạn nếu bạn không thể bắt và loại bỏ sự kiện đó. Halway down the page is an example of how to do it for java in linux/Windows - it's not a portable thing. Về cơ bản, chương trình của bạn sẽ xử lý các sự kiện bàn phím thay vì bàn điều khiển gửi các sự kiện keybaord đến nó. Điều này có nghĩa là dòng lệnh bị bỏ qua và không thể đọc cuộc gọi ctrl-c. Tôi viết mã, nhưng bây giờ tôi đang làm việc; Thứ tư là một ngày dài đối với tôi. Nếu bạn không nhận được nó khi tôi về nhà, tôi sẽ xem xét một số ví dụ.

+0

Cảm ơn sự hỗ trợ của bạn, tuy nhiên các liên kết đó đề cập đến việc thiết lập các móc tắt máy, mà JVM gọi trước khi chấm dứt ứng dụng. Ứng dụng vẫn bị chấm dứt, đó là những gì tôi đang cố gắng ngăn chặn. –

+0

Hãy thử IBM mà tôi vừa thêm vào. Xin lỗi, tôi đang ở trong một lớp học; Tôi sẽ có thể xem xét kỹ hơn sau khi tôi ra ngoài, nhưng đó dường như là bài viết hay nhất. –

+1

Trang bài viết được IBM giới thiệu nói rằng nó không thể được hiển thị - 404: ( – Mike

2

Bạn cần sử dụng SignalHandler để chặn tín hiệu SIGINT được kích hoạt bởi CTRL-C. CTRL-C sẽ được xử lý ở cấp hệ điều hành giả sử bạn không muốn VM nhận tín hiệu.

IBM developerWorks có một bài viết về làm điều này - http://www.ibm.com/developerworks/ibm/library/i-signalhandling/?open&l=409,t=grj,p=jsh

Oracle liên kết - http://www.oracle.com/technetwork/java/javase/signals-139944.html

+0

Không ai trong số những liên kết đó dường như hoạt động đáng tiếc - chúng thực sự hữu ích. Tôi vừa xem http://ringlord.com/dl/Signals-in-Java.pdf có thể hoặc có thể không phải là những thứ tương tự mà bạn đang đề cập đến. Sử dụng các cuộc gọi API Sun riêng tư –

2

tôi sẽ giả định nếu bạn bắt đầu một KeyListener để xử lý các trường hợp Ctrl + C được ép nó nên hoặc là phủ nhận ' phản ứng tự nhiên hoặc gọi một chương trình con mà bạn đã thiết kế thay thế.

+1

Các giả định không phải là câu trả lời, đây là một lời nhận xét: –

+1

Giả định cũng sai. –

Các vấn đề liên quan