2012-02-25 42 views
3

在Perl中,我們可以這樣做:通過Java的Ctrl + C信號?

print("\x03"); 

按Ctrl +ç

是否有類似的東西,我們可以用Java做什麼?

+1

轉寄此** [http://stackoverflow.com/questions/1216172/java-how-could-i-intercept-ctrlc-in-a-cli-application](http://stackoverflow.com/questions/1216172/java的如何-可能-I-截距-CTRLC-IN-A-CLI應用程序)**和** [http://stackoverflow.com/questions/1611931/catching-ctrlc-in-java]( http://stackoverflow.com/questions/1611931/catching-ctrlc-in-java)** – 2012-02-25 07:51:25

+0

如果另一端是telnet會話,你爲什麼不乾脆關閉會話? – tripleee 2012-02-25 10:33:16

+0

因爲我需要進一步使用連接。斷開並重新連接不起作用。 – rv1822 2012-02-25 11:16:51

回答

-2

你試過:

System.out.print((char)3); 
7

在Perl中,我們可以這樣做:[...]

真的嗎?你有沒有試過它終止任何程序?

這個例子

#!/usr/bin/perl 
print "\x03"; 
print "\n"; 
print "Hello World!\n"; 

將打印

<funny character> 
Hello World! 

輸出管道傳輸到其他程序也不會終止任何人。

您想發送^ C 信號。但你真的只是發送0x03 字節。如果你想終止一個你不得不使用這樣的事情(OS dependend):

kill(process_id_of_destination, SIGTERM); 

混亂的根源是,在一個正常的終端窗口中OS截獲^ C鍵和翻譯它輸入TERM信號。但是程序不會在它的輸入流上接收到^ C,它會收到信號並且可能會在一些註冊的鉤子中處理它。所以,如果你自己寫^ C,它只是簡單的數據,不會被專門處理。

附錄

下面的文本只適用於Unixoids/Linux的,但很可能沒有到Windows。我認爲沒關係,因爲telnet,perl,tail -f表示Unix背景。

如前所述:將^ C(又名字節0x03)發送到進程的標準輸入不會觸發任何信號。通常。但終端窗口本身和其他一些程序,如rlogin,telnet,sshd必須假裝,然後運行的東西直接連接到終端。這包括將一些關鍵組合轉換成一些信號。這是使用「僞終端」(aka。pty或pts)完成的。關於這個東西查找的詳細信息man 4 ptsman 7 pty和/或閱讀理查德史蒂文斯Unix的書。 您的情況摘錄如下:寫入「master PTY」的數據將完全像鍵盤輸入一樣處理。因此寫入主文件中的^ C將被翻譯成傳遞給讀取「slave PTY」的過程的信號。因此,如果Perl中的print("\x03");工作,並且Java版本System.out.println('\3');不支持,那麼我認爲Perl以某種方式設置不同,並寫入PTY主站,而Java僅寫入普通管道。

+0

這裏就是我想要做的事 - '$ telnet->打印( 「尾-f LOGFILE.LOG」); // WAITFOR一些字符,然後telnet- $>打印( 「\ X03」);'。這工作。我試圖在java中做同樣的事情,但我無法回到提示。 – rv1822 2012-02-25 10:16:01

+0

這不是一個「命令」,它是一個信號(術語後面的答案是正確的)。 – tripleee 2012-02-25 10:31:40

+0

其實,SIGTERM之後SIGKILL如果需要的話:) – DVK 2012-02-25 13:05:19