在 perl 中,我们可以这样做:
print("\x03");
做Ctrl+C
我们可以在 Java 中做类似的事情吗?
在 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 pts
和man 7 pty
/或阅读 Richard Stevens 的 Unix 书籍。您的案例摘录是:写入“主 PTY”的数据将完全像键盘输入一样处理。因此,写入主机的 ^C 将被转换为一个信号,该信号被传递给读取“从 PTY”的进程。print("\x03");
System.out.println('\3');
没有,那么我假设 Perl 以某种方式设置不同并写入 PTY 主机,而 Java 只写入普通管道。
你有没有尝试过:
System.out.print((char)3);