Mer*_*ado 11 linux assembly nasm system-calls tty
我是汇编的初学者(使用nasm).我正在通过大学课程学习集会.
我试图了解sys_read linux系统调用时的行为.具体来说,sys_read在读取新行或换行符时停止.根据我所教的,这是事实.这篇在线教程文章也肯定了事实/主张.
当sys_read检测到换行时,控制返回到程序,用户输入位于您在ECX中传递的内存地址.
我检查了linux程序员的sys_read调用手册(通过"man 2 read").它没有提到它应该的行为,对吧?
read()尝试从buf开始读取从文件描述符fd到缓冲区的字节数.
在支持搜索的文件上,读取操作从文件偏移开始,文件偏移量增加读取的字节数.如果文件偏移量等于或超过文件末尾,则不读取任何字节,read()返回零.
如果count为零,则read()可以检测下面描述的错误.在没有任何错误的情况下,或者read()没有检查错误时,计数为0的read()返回零并且没有其他影响.
如果count大于SSIZE_MAX,则结果未指定.
所以我的问题是,为什么会发生这种行为?Linux内核中的规范是否应该发生这种情况还是其他内容的结果?
Pet*_*des 11
这是因为你正在以规范模式读取POSIX tty(在你按回到"提交"线之前退格工作;这都是由内核的tty驱动程序处理的).查找POSIX tty语义/ stty/ioctl.如果你跑了./a.out < input.txt,你就不会看到这种行为.
请注意,read()如果您点击control-d(EOF tty控制序列),在TTY上将返回没有换行符.
假设read()读取整行对于玩具程序是可以的,但是不要开始假设任何需要强大的东西,即使你已经检查过你正在读取TTY.我忘记了如果用户将多行文本粘贴到终端模拟器中会发生什么.很可能他们都在一个read()缓冲区中.
另请参阅我关于小号read()在终端上留下未读数据的问题的答案:如果在一行上键入的字符多于read()缓冲区大小,则至少需要再读取一次系统调用以清除输入.
如你所知,read(2)libc函数只是一个很薄的包装器sys_read.这个问题的答案实际上与汇编语言无关,对于C语言(或任何其他语言)的系统编程也是如此.
进一步阅读:
stty(1) 手册页:您可以在哪里更改哪个控制角色做什么.这不是read()系统调用的属性,而是termios终端驱动程序的属性。在默认配置中,termios会缓冲输入的字符(即您键入的内容),直到您按Enter,然后将整行发送到从终端读取的程序中。这是为了方便起见,因此您可以在发送之前编辑该行。
正如Peter Cordes所说,从其他类型的文件(如常规文件)读取时,此行为不存在,可以通过配置termios来将其关闭。
本教程所说的是垃圾,请忽略它。