Bir CLI uygulamasında Ctrl + C'yi nasıl "kesebilirim"?


85

Bir CLI (komut satırı arayüzü) Java uygulamasında + (normalde süreci sonlandırır) nasıl engelleyebilirim ?CtrlC

Çoklu platform çözümü mevcut mu (Linux, Solaris, Windows)?

Console'S kullanıyorum readLine(), ancak gerekirse, standart girdiden karakterleri okumak için başka bir yöntem kullanabilirim.

Yanıtlar:


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

Bu, sinyali yakalayabilmelidir, ancak yalnızca JVM kendini tamamen kapatmadan önceki bir ara adım olarak, bu nedenle aradığınız şey olmayabilir.

Bir + tarafından tetiklenen sinyali (Unix ve Windows'ta) kesmek için a SignalHandler( sun.misc.SignalHandler) kullanmanız gerekir . Bkz bu makaleyi (pdf, sayfa 8 ve 9).SIGINTCtrlC


5
@MartijnCourteaux Bu beş yıl sonra oluyor;) Bu konuda benzer bir kaynak buldum ve bağlantıyı buna göre değiştirdim.
VonC

@VonC - Yine Öldü
Gurwinder Singh

@GurV Hangi bağlantı? Nisan 2014'te yaptığım düzenleme ( stackoverflow.com/revisions/… ) hala geçerli: pdf dosyasını yine de indirebilirsiniz ..
VonC

16

Sorunsuz bir şekilde kapatmak istediğinizi ve kapatma sürecini kısa devre yapmak istemediğinizi varsayıyorum. Varsayımım doğruysa, Kapatma Kancalarına bakmalısınız .


Daha önce kapatma kancalarını hiç duymadım. Teşekkür ederim!
ivan_ivanovich_ivanoff

8

Herhangi bir nedenle kapatmadan Ctrl+ işlemlerini yapabilmek için C, bir tür sinyal işleme kullanmanız gerekir (çünkü Ctrl+ Cgirişi aslında doğrudan uygulamanıza iletilmez, bunun yerine üreten işletim sistemi tarafından işlenir. daha sonra Java'ya geçen bir SIGINT.

Sinyal işlemeyle ilgili ayrıntılar için http://www.oracle.com/technetwork/java/javase/signals-139944.html adresine bakın .

(Sadece nazikçe kapatmak istiyorsanız, akf'ın cevabı yeterli olacaktır.)


4

SIGTERM'in nasıl kullanılacağına ilişkin bazı bağlantılar - bu, programın işletim sistemi tarafında aldığı sinyaldir:

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/

Bu POSIX işletim sistemlerinde çalışmalı - yani, Mac ve Unix çalışmalı, Windows üzerinde emin değilim, aynı zamanda bir dereceye kadar POSIX uyumlu olduğunu da hatırlıyorum, ancak farklı sürümlerle çok fazla çarpışabilir.


1
İkinci bağlantı başarısız. Oracle.com/technetwork/java/javase/tsg-vm-149989.pdf adresinde Oracle olarak değiştirildi mi?
şans

üçüncü halka da başarısız
Hugo Zaragoza
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.