从this thread讨论讨论文件描述符和表格;
我想知道如何在shell中处理stdin(即文件描述符0,而不是C的stdin FILE结构)。
当我在C中运行像read(0, buffer, 1024)
这样的代码时,默认情况下C文件描述符0连接到键盘,shell允许我输入文本,因为我们假设读取正在等待读取字符设备'标准输入'的内容,即键盘。但是,标准输入不会是空的并且产生结果吗?好吧,那么让我们说'连接到键盘'的路径是解释它的方式;如果是这种情况,那么那必然意味着shell行缓冲他们的命令,对吗?调用文件描述符0上的读取意味着shell中的文件描述符0连接到标准输入的行缓冲缓冲区输出,而不是直接连接到键盘,那么是什么让C等待?此外,为什么我们不能在标准输入上使用lseek()
- 所谓的'文件'总是被覆盖每次“写入”,因此没有什么可以寻找的标准输入(作为键盘)是不是存储设备本身的文件?
答案 0 :(得分:2)
read(0, buffer, 1024)
是系统调用,是对内核代码的调用。内核的read
实现将发送到终端(或伪终端)设备驱动程序,该驱动程序将等待您输入1024个字符,换行符或EOF标记,< KBD>控制 + d
然后那必须意味着贝壳线缓冲他们的命令,对吧?
如果终端设置为正确模式,则在终端驱动程序中执行缓冲。否则,程序将等待直到输入1024个字节。
此外,为什么我们不能在标准输入
上使用lseek()
如果stdin是常规文件,您可以。您无法在终端上进行搜索,因为这需要终端驱动程序记住自创建以来通过终端设备传输的所有数据。