在perl中,我们可以这样做:
print("\x03");
Run Code Online (Sandbox Code Playgroud)
做Ctrl+C
我们可以用Java做类似的事吗?
在perl中,我们可以这样做:[...]
真?你尝试过它终止了任何程序吗?
这个例子
#!/usr/bin/perl
print "\x03";
print "\n";
print "Hello World!\n";
Run Code Online (Sandbox Code Playgroud)
会打印
<funny character>
Hello World!
Run Code Online (Sandbox Code Playgroud)
将输出管道输送到其他程序也不会终止任何程序.
您想发送^ C 信号.但你真的只是发送0x03 字节.如果你想终止某人,你必须使用这样的东西(OS dependend):
kill(process_id_of_destination, SIGTERM);
Run Code Online (Sandbox Code Playgroud)
混乱的来源是,在一个正常的终端窗口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/或阅读Richard Stevens的Unix书籍.您的案例摘录如下:写入"master PTY"的数据将完全像键盘输入一样处理.因此写入主设备的^ C将被转换为信号,该信号被传送到读取"从设备"的过程.因此,如果您print("\x03");的Perl工作而Java版本System.out.println('\3');没有,那么我假设Perl以某种方式设置不同并写入PTY主服务器而Java只写入普通管道.
| 归档时间: |
|
| 查看次数: |
3211 次 |
| 最近记录: |