ฉันจะ "สกัดกั้น" Ctrl + C ในแอปพลิเคชัน CLI ได้อย่างไร


85

ฉันจะดักจับ Ctrl + C(ซึ่งปกติจะฆ่ากระบวนการ) ในแอปพลิเคชัน Java CLI (อินเตอร์เฟสบรรทัดคำสั่ง) ได้อย่างไร

มีโซลูชันหลายแพลตฟอร์ม (Linux, Solaris, Windows) หรือไม่

ฉันใช้Console's readLine()แต่ถ้าจำเป็นฉันสามารถใช้วิธีการอื่นในการอ่านตัวอักษรจากอินพุตมาตรฐาน

คำตอบ:


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

สิ่งนี้ควรจะสามารถดักจับสัญญาณได้ แต่เป็นเพียงขั้นตอนกลางก่อนที่ JVM จะปิดตัวเองอย่างสมบูรณ์ดังนั้นจึงอาจไม่ใช่สิ่งที่คุณกำลังดูแล

คุณต้องใช้ a SignalHandler( sun.misc.SignalHandler) เพื่อดักจับSIGINTสัญญาณที่เรียกโดยCtrl+ C(บน Unix และบน Windows)
ดูบทความนี้ (pdf หน้า 8 และ 9)


5
@MartijnCourteaux ที่เกิดขึ้นหลังจากห้าปี;) ฉันพบแหล่งข้อมูลที่คล้ายกันในหัวข้อนั้นและได้เปลี่ยนลิงค์ตามนั้น
VonC

@VonC - ตายอีกแล้ว
Gurwinder Singh

@GurV ลิงค์ไหน การแก้ไขที่ฉันทำในเดือนเมษายน 2014 ( stackoverflow.com/revisions/… ) ยังใช้ได้: คุณยังดาวน์โหลดไฟล์ pdf ได้ ..
VonC

16

ฉันสมมติว่าคุณต้องการปิดเครื่องอย่างสวยงามและไม่ทำให้กระบวนการปิดเครื่องลัดวงจร หากสมมติฐานของฉันถูกต้องแล้วคุณควรจะดูเบ็ด Shutdown


ไม่เคยได้ยินเกี่ยวกับการปิดเครื่องมาก่อน ขอขอบคุณ!
ivan_ivanovich_ivanoff

8

เพื่อให้สามารถจัดการCtrl+ Cโดยไม่ต้องปิดเครื่องด้วยเหตุผลบางประการคุณจะต้องใช้รูปแบบการจัดการสัญญาณบางรูปแบบ (เนื่องจากCtrlCอินพุต+ ไม่ได้ส่งผ่านไปยังแอปพลิเคชันของคุณโดยตรง แต่จะจัดการโดยระบบปฏิบัติการที่สร้างขึ้น SIGINT ที่ถูกส่งผ่านไปยัง Java

ดู http://www.oracle.com/technetwork/java/javase/signals-139944.htmlสำหรับรายละเอียดเกี่ยวกับการจัดการสัญญาณ

(หากคุณแค่ต้องการปิดระบบอย่างสง่างามคำตอบของ akf ก็เพียงพอแล้ว)


4

ลิงก์บางส่วนเกี่ยวกับวิธีจัดการ SIGTERM - นั่นคือสัญญาณที่โปรแกรมได้รับจากฝั่ง 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/

สิ่งนี้ควรทำงานบนระบบปฏิบัติการ POSIX นั่นคือ Mac และ Unix ควรใช้งานได้บน windows ฉันไม่แน่ใจฉันจำได้ว่าได้ยินว่ามันเข้ากันได้กับ POSIX ในระดับหนึ่ง แต่อาจแตกต่างกันมากกับเวอร์ชันที่แตกต่างกัน


1
ลิงค์ที่สองล้มเหลว เปลี่ยนเป็น Oracle ที่ oracle.com/technetwork/java/javase/tsg-vm-149989.pdfหรือไม่
โอกาส

ลิงค์ที่สามล้มเหลวเช่นกัน
Hugo Zaragoza
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.