Linux 为什么sys_read系统调用在检测到新行时结束?

Linux 为什么sys_read系统调用在检测到新行时结束?,linux,assembly,nasm,system-calls,tty,Linux,Assembly,Nasm,System Calls,Tty,我是汇编的初学者(使用nasm)。我正在通过一门大学课程学习组装 我试图理解sys_read linux系统调用在被调用时的行为。具体来说,系统读取新行或换行时停止。根据我所学到的,这是真的。这也证实了这一事实/主张 当sys_read检测到换行时,控制返回程序,用户输入位于您在ECX中传递的内存地址 我查看了linux程序员手册中的sys_read调用(通过“man2 read”)。它没有提到应该提到的行为,对吗 read()尝试从文件描述符fd读取多达个字节 从buf开始进入缓冲区 在支持查

我是汇编的初学者(使用nasm)。我正在通过一门大学课程学习组装

我试图理解sys_read linux系统调用在被调用时的行为。具体来说,系统读取新行或换行时停止。根据我所学到的,这是真的。这也证实了这一事实/主张

当sys_read检测到换行时,控制返回程序,用户输入位于您在ECX中传递的内存地址

我查看了linux程序员手册中的sys_read调用(通过“man2 read”)。它没有提到应该提到的行为,对吗

read()尝试从文件描述符fd读取多达个字节 从buf开始进入缓冲区

在支持查找的文件上,读取操作从 文件偏移量,文件偏移量按字节数递增 阅读如果文件偏移量位于或超过文件末尾,则不显示任何字节 read,read()返回零

如果count为零,read()可能会检测到下面描述的错误。在里面 如果没有任何错误,或者如果read()没有检查错误,则 计数为0的read()返回零,没有其他效果

如果计数大于SSIZE_MAX,则结果未指定


所以我的问题是,为什么会发生这种行为?这应该是linux内核中的一个规范,还是其他原因造成的?

这不是
read()
系统调用的属性,而是终端驱动程序
termios
的属性。在默认配置中,termios缓冲输入字符(即您键入的字符),直到按Enter键,然后将整行发送到从终端读取的程序。这是为了方便,因此您可以在发送前编辑该行

正如Peter Cordes已经说过的,在读取其他类型的文件(如常规文件)时,这种行为不存在,可以通过配置termios来关闭


教程所说的是垃圾,请忽略它。

这是因为您正在从a读取(在按return键“提交”行之前,backspace起作用;这一切都由内核的tty驱动程序处理)。查找POSIX tty语义/stty/ioctl。如果运行
/a.out
,则不会看到这种行为

请注意,如果点击control-d(EOF TTY控制序列),TTY上的
read()
将返回而不换行

假设
read()。我忘记了如果用户将多行文本粘贴到终端仿真器中会发生什么。很可能它们最终都位于一个
read()
缓冲区中


另请参见:如果在一行中键入的字符数超过
read()
缓冲区大小,则至少需要再调用一次read系统来清除输入


正如您所指出的,libc函数只是
sys\u read
的一个薄包装。这个问题的答案实际上与汇编语言无关,对于C(或任何其他语言)的系统编程也是如此

进一步阅读:

  • 手册页:您可以在其中更改哪个控件角色做什么
  • :一些历史记录和一些图表显示了xterm、内核和从tty读取的进程是如何交互的。还有关于会话管理和信号的东西
  • 以及该文章的相关部分

我喜欢最后一句话:D非常感谢你的解释:)@Mercado我很高兴!非常感谢您的解释和参考!