gpt4 book ai didi

java - 通过 Java 的 Ctrl+C 信号?

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:54:22 27 4
gpt4 key购买 nike

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

print("\x03");

执行Ctrl+C

我们可以用 Java 做一些类似的事情吗?

最佳答案

In perl, we can do this : [...]

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

这个例子

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

将打印

<funny character>
Hello World!

将输出通过管道传输到其他程序也不会终止它们中的任何一个。

您想发送 ^C <​​strong>信号。但您实际上只是发送了 0x03 字节。如果你想终止某人你必须使用这样的东西(取决于操作系统):

kill(process_id_of_destination, SIGTERM);

混淆的根源在于,在正常的终端窗口中,OS 拦截了 ^C 键并将其翻译TERM 信号。但是程序不会在其输入流上接收到 ^C,它会接收到信号,并且可能会在某个已注册的 Hook 中对其进行处理。所以如果你自己写^C就是普通数据,不会做特殊处理。

附录

以下文本仅适用于 Unixoids/Linux,但很可能不适用于 Windows。我觉得没问题,因为telnetperltail -f表示Unix背景。

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

关于java - 通过 Java 的 Ctrl+C 信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9442199/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com