如何发出 stdin 输入结束的信号

Tim*_*Tim 93 command-line terminal signals

  1. 在 Bash 中,我了解到可以通过此处的文档更改结束信号。但默认情况下,我如何发出 stdin 输入结束的信号?
  2. 我碰巧发现使用 cat 和 chardet,它们的 stdin 输入可以通过 Ctrl+d 表示完成。但我似乎记得 Ctrl+d 和 Ctrl+c 类似于结束正在运行的命令的执行。所以我错了吗?

Gil*_*il' 135

Ctrl+D, 当在终端的行首输入时,表示输入的结束。这不是unix 意义上的信号:当应用程序正在从终端读取并且用户按下 时Ctrl+D,应用程序会收到通知说已经到达文件末尾(就像它正在从文件中读取并通过了最后一个字节)。

Ctrl+C确实发送了一个信号,SIGINT。默认情况下,SIGINT(中断信号)会杀死前台应用程序,但应用程序可以捕获信号并以某种不同的方式做出反应(例如,shell 本身捕获信号并中止您开始键入的行,但它不会t 退出,它会显示一个新的提示并等待一个新的命令行)。

您可以使用命令更改与文件结尾和 SIGINT 相关联的字符stty,例如,stty eof aa生成文件结尾字符,并stty intr ^-禁用 SIGINT 字符。这很少有用。

  • @Tim:你想要的是小写字母......使用大写字母编写键盘命令的惯例是因为键盘上的标签总是大写的,并且所描述的东西是一个键序列,而不是程序看到的实际字符代码。是的,这有时令人困惑。 (9认同)
  • @Tim 在终端上,组合键“Ctrl+Shift+D”和“Ctrl+D”无论如何都会发送相同的字符(字符号 4,通常称为“Ctrl+D”)。 (2认同)
  • @Tim * 终端 * 收到 Ctrl+D。它不会向程序发送字符。发生的情况是,当程序从终端读取时,终端告诉它“这是文件的结尾”,与程序尝试在磁盘文件结尾之后读取时相同。根本不涉及外壳。 (2认同)

Cal*_*leb 27

你的第二点将两个完全不同的东西混为一谈。

  • Ctrl+C 向正在运行的进程发送终止信号。
  • Ctrl+D 发送传输结束字符。

您正在寻找后者。

  • 这里可能会引起混淆:从应用程序的角度来看,没有为 ^D 发送任何实际字符。这意味着应用程序不会从 `read(2)` 系统调用中接收到该字符。 (12认同)