2

让我们看看下面的代码:

int main(void)
{
             char c;

             while ((c = getchar()) != EOF)
                     putchar(c);

             return (0);
 }

该程序仅在将新行作为字符传递后才回显字符。我尝试使用 read 系统调用直接读取并将 len 作为 1 传递,它仍然只在传递新行时读取。我这里有两个问题:谁实现了这个优化,是内核还是终端/shell?

其次,谁在第一时间回响这些字符,也就是在第一次印刷本身。终端/shell 在该程序的整个执行过程中是否起任何作用?

4

2 回答 2

4

外壳无关紧要。您键入的 tty(假设它不是原始模式,并且启用了回显)在您键入字符时显示字符,但在您键入 enter 之前不会将它们传递给进程。它处理所有退格和编辑等,您的进程永远不会看到这些。当您按 Enter 时,tty 会将输入的行传递给进程。

于 2013-01-14T20:22:54.043 回答
1

当一个任务正在执行时(例如你的程序),它处于“RUNNING”状态。

当程序请求键盘输入时,内核暂停您的程序并将键盘输入连接到程序内存中的缓冲区(由 IA32 架构中的 LDT 和 GDT 寄存器维护)

键盘数据通过 IVT(中断向量表)中的特定中断函数读取(该表使用 IA32 Arch 中的 IDT 维护)

当遇到新行时(通过按键盘上的 ENTER 键),输入缓冲区关闭,任务从“暂停”状态变为“就绪”状态。

多任务内核几乎没有“时间”来等待用户输入并将其回显到输出。相反,它将键盘连接到缓冲区,然后去执行其他重要任务(例如任务调度)。当程序处于“运行”状态,并且键盘缓冲区被填满时,它会从缓冲区中读取输入,并将其写入输出缓冲区。

然而,Shell 只是一个由内核调度的程序。它不能直接访问键盘,但可以访问内核分配的特定键盘缓冲区。

于 2013-01-14T20:23:15.777 回答