В 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 записывает только в простой канал.