Ctrl + C сигнал через Java? - PullRequest
       21

Ctrl + C сигнал через Java?

3 голосов
/ 25 февраля 2012

В Perl мы можем сделать это:

print("\x03");

, чтобы сделать Ctrl + C

Есть ли что-то подобное, что мы можем сделать в Java?

Ответы [ 2 ]

7 голосов
/ 25 февраля 2012

В Perl мы можем сделать это: [...]

В самом деле? Вы пробовали, и это остановило любую программу?

Этот пример

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

Распечатает

<funny character>
Hello World!

Передача вывода в какую-либо другую программу также не прервет ни одну из них.

Вы хотите отправить сигнал ^ C . Но вы действительно просто посылаете 0x03 байт . Если вы хотите прекратить работу кого-то, вы должны использовать что-то вроде этого (зависит от ОС):

kill(process_id_of_destination, SIGTERM);

Источник путаницы заключается в том, что в обычном терминальном окне OS перехватывает клавишу ^ C и переводит в сигнал TERM. Но программа не получит этот ^ C в своем входном потоке, она получит сигнал и может обработать его в некотором зарегистрированном хуке. Так что если вы пишете ^ C самостоятельно, это просто обычные данные, которые не будут обрабатываться специально.

Приложение

Следующий текст относится только к Unixoids / Linux, но, скорее всего, не к Windows. Я думаю, что все в порядке, потому что telnet, perl, tail -f указывают на фон Unix.

Как уже упоминалось: отправка ^ C (он же байт 0x03) на стандартный вход процесса не вызовет никакого сигнала. Обычно. Но само окно терминала и некоторые другие программы, такие как rlogin, telnet, sshd, должны делать вид, что работающий в них компонент подключен непосредственно к терминалу. Это включает в себя преобразование некоторых комбинаций клавиш в несколько сигналов. Это делается с помощью «псевдо-терминалов» (он же. Pty или pts). Подробнее об этом материале ищите man 4 pts и man 7 pty и / или читайте книгу Рихарда Стивенса по Unix. Выдержка для вашего случая: данные, записанные в «master PTY», будут обрабатываться точно так же, как ввод с клавиатуры. Таким образом, ^ C, записанный в мастере, будет преобразован в сигнал, который передается процессу, читающему «подчиненный PTY». Так что, если ваш print("\x03"); в Perl работает, а версия Java System.out.println('\3'); не работает, то я предполагаю, что Perl каким-то образом настроен по-другому и записывает в мастер PTY, а Java записывает только в простой канал.

0 голосов
/ 25 февраля 2012

Вы пробовали:

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