如何用信号通知标准输入结束


82
  1. 在Bash中,我了解到可以通过here文档更改结束信号。但是默认情况下,我如何发信号通知标准输入结束?
  2. 我偶然发现,使用cat和chardet时,可以通过Ctrl + d将其stdin输入表示为完成。但是我似乎记得Ctrl + d和Ctrl + c与结束正在运行的命令的执行类似。那我错了吗?

Answers:


114

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

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

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


谢谢!是否Ctrl+D意味着Ctrl键和资本 d或不要紧?
蒂姆(Tim)

5
@Tim:您要使用小写字母...用大写字母写键盘命令的约定是因为键盘上的标签始终用大写字母,并且所描述的内容是键顺序,而不是程序看到的实际字符代码。是的,这有时会造成混淆。
Caleb

@Caleb:谢谢!应该如何指定密钥在大写中?还是有这种情况?
蒂姆(Tim)

@Tim在终端上,无论如何组合键Ctrl+Shift+DCtrl+D发送相同的字符(4号字符,通常称为Ctrl+D)。
吉尔斯

2
@Tim 终端收到Ctrl + D。它不会向程序发送字符。发生的情况是,当程序从终端读取时,终端会告诉它“这是文件的末尾”,就像程序在磁盘文件末尾后尝试读取时一样。完全不涉及外壳。
吉尔斯

23

您的第二点将两个完全不同的东西放在一起。

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

您正在寻找后者。


7
这里可能造成混乱:从应用程序的角度来看,没有为^ D发送任何实际字符。这意味着应用程序无法从read(2)系统调用中接收该字符。
ulidtko
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.