让我们看看以下代码:
int main(void)
{
char c;
while ((c = getchar()) != EOF)
putchar(c);
return (0);
}
此程序回显字符,仅在将新行作为字符传递之后。 我尝试使用read系统调用直接读取并将len传递为1,它仍然只在传递新行时才读取。我在这里有两个问题:谁实现了这种优化,是内核还是终端/ shell?
其次,谁回首第一位的角色,就是第一次按下本身。终端/ shell在整个程序执行中是否起任何作用?
答案 0 :(得分:4)
shell无关紧要。您键入的tty(假设它不处于原始模式,并且启用了回显)会在您键入时显示字符,但在您键入enter之前不会将它们传递给进程。它处理所有退格和编辑等,您的过程永远不会看到它们。当您按Enter键时,tty会将输入的行传递给流程。
答案 1 :(得分:1)
执行任务时(例如程序),它处于“RUNNING”状态。
当程序请求键盘输入时,内核暂停程序并将键盘输入连接到程序存储器中的缓冲区(由IA32 arch中的LDT和GDT寄存器维护)
使用IVT(中断向量表)中的特定中断函数读取键盘数据(此表使用IA32 Arch中的IDT进行维护)
当遇到新行时(通过按键盘上的ENTER键),输入缓冲区关闭,任务从“暂停”状态进入“就绪”状态。
多任务内核几乎没有等待用户输入并将其回送到输出的“时间”。相反,它将键盘连接到缓冲区并离开以执行其他重要任务(例如任务调度)。当程序处于“运行”状态并且键盘缓冲区已满时,它将从缓冲区读取输入,并将其写入输出缓冲区。
然而,Shell只是一个由内核调度的程序。它无法直接访问键盘,但可以访问内核分配的特定键盘缓冲区。