3

在 perl 中,我们可以这样做:

print("\x03");

Ctrl+C

我们可以在 Java 中做类似的事情吗?

4

2 回答 2

7

在 perl 中,我们可以这样做:[...]

真的吗?您是否尝试过它终止了任何程序?

这个例子

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

将打印

<funny character>
Hello World!

将输出传送到其他程序也不会终止其中任何一个程序。

您想发送 ^C信号。但你真的只是发送 0x03字节。如果你想终止某人,你必须使用这样的东西(操作系统依赖):

kill(process_id_of_destination, SIGTERM);

混乱的根源是,在正常的终端窗口中,操作系统会拦截 ^C 键并将其转换TERM信号。但是程序不会在它的输入流上接收到那个^C,它会接收到信号并且它可能会在一些注册的钩子中处理它。因此,如果您自己编写 ^C 它只是普通数据,不会进行特殊处理。

附录

以下文本仅适用于 Unixoids/Linux,但很可能不适用于 Windows。我认为没关系,因为telnet, perl,tail -f表示 Unix 背景。

如前所述:将 ^C(又名字节 0x03)发送到进程的标准输入不会触发任何信号。通常。但是终端窗口本身和其他一些程序,如 rlogin、telnet、sshd 必须假装在其中运行的东西直接连接到终端。这包括将一些关键组合转换为一些信号。这是使用“伪终端”(又名 pty 或 pts)完成的。有关这些内容的详细信息,请查阅man 4 ptsman 7 pty/或阅读 Richard Stevens 的 Unix 书籍。您的案例摘录是:写入“主 PTY”的数据将完全像键盘输入一样处理。因此,写入主机的 ^C 将被转换为一个信号,该信号被传递给读取“从 PTY”的进程。print("\x03");System.out.println('\3');没有,那么我假设 Perl 以某种方式设置不同并写入 PTY 主机,而 Java 只写入普通管道。

于 2012-02-25T07:44:21.387 回答
-2

你有没有尝试过:

System.out.print((char)3);
于 2012-02-25T07:39:07.360 回答