【发布时间】:2014-06-10 08:44:09
【问题描述】:
借鉴this thread讨论文件描述符和表格;
我想知道在 shell 中如何处理标准输入(即文件描述符 0,而不是 C 的标准输入 FILE 结构)。
当我在 C 中运行像 read(0, buffer, 1024) 这样的代码时,默认情况下,在 C 文件描述符 0 中连接到键盘,shell 允许我输入文本,因为我们假设 read 正在等待读取字符设备“标准输入”的内容,也就是键盘。但是,标准输入不会简单地为空并产生结果吗?好吧,让我们说“连接到键盘”路径是解释它的方式;如果是这种情况,那么这一定意味着 shell 行缓冲他们的命令,对吗?对文件描述符 0 调用读取意味着 shell 中的文件描述符 0 连接到标准输入的行缓冲缓冲区输出,而不是直接连接到键盘,那么是什么让 C 等待呢?此外,为什么我们不能在标准输入上使用lseek() - 是否说“文件”总是被每一次“写入”覆盖,因此没有什么可寻找的,因为标准输入(作为键盘)并不是真的存储设备本身上的文件?
【问题讨论】:
-
C 对“键盘”一无所知——它只知道
stdin,这是一个字节流。它使用阻塞 I/O 进行读取,这意味着如果stdin上没有可读取的字符,则它会一直等到有字符。 -
“空虚”和“等待”并不是相互排斥的。重要的是文件描述符是否打开。
标签: c linux stdin file-descriptor