Answers:
它的工作方式与之相同,因为Unix是全双工的。正如Ritchie在UNIX分时系统:回顾中所说:
全双工终端I / O与预读功能在一起看似微不足道,但一旦使用就产生了惊人的变化。即使程序通常以行而不是单个字符与用户通信,但全双工终端I / O意味着即使系统正在回退,用户也可以随时键入,而不必担心丢失或乱写字符。使用预读功能,无需等待对每一行的响应。一位优秀的打字员在开始每一行之前都不得不暂停,这令他感到沮丧。对于任何知道他想说什么的人,如果必须逐位而不是全速输入信息,那么任何反应迟钝都会在心理上被放大。
[结束报价]
话虽这么说,有些现代程序会吃光或丢弃任何预先输入的内容。ssh
和apt-get
是两个例子。如果您在运行时键入内容,则可能会发现输入的第一部分已消失。可以想象这可能是个问题。
ssh remotehost do something that takes 20 seconds
mail bob
Dan has retired. Feel free to save any important files and then do
# ssh exits here, discarding the previous 2 lines
rm -fr *
.
bash
fork()
s和exec
s命令之后,第一个命令是否仍附加STDIN
在bash shell的上?听起来答案是否定的,bash似乎正在缓冲下一条命令。那是对的吗?
&
。
STDIN
fifo的方式处理的吗?我猜想,除非庆典的子进程显式地关闭其继承文件句柄,STDIN
那么它可能仍然附加打字看?
您所看到的基本行为是,输入将被放置在缓冲区中直到被读取为止(好吧,如果您键入足够多,最终缓冲区将被填满,并且某些内容将丢失,尽管如此,键入还是很多)。make运行的大多数内容都不从STDIN读取,因此它保留在缓冲区中。
危险是错误的命令会读取您的输入。例如,make
调用决定提示您的内容,然后它可能会读取您的下一个命令作为答案。当然,这有多危险取决于命令。(他们也可能会先刷新所有输入,只是丢弃先前的输入。)
TeX是Makefile中常用的一个命令。如果遇到错误(并且没有提供从未提示用户的标志),它将提示您如何继续。
更好的选择可能是运行:make && make check
。
make
在您的示例中)成功完成的第二个命令。例如,make foo
Enter> ./foo
Enter 可能会引起问题。您可能想养成键入之类的习惯make && make check
,其中仅当第一个命令成功时才执行第二个命令。make check
,您将最终执行命令heck
,该命令在您的系统上可能不存在(但可能有点讨厌)。如果第一个命令是您了解并信任的良性操作,那么我不会立即发现任何问题。ls
与mount
例如。我试图了解如何处理缓冲的输入。感谢您的回答。