Linux 字符设备是否应该以换行符终止 read()

Should Linux character devices terminate read() with newline

POSIX 将 text file 定义为:

A file that contains characters organized into one or more lines.

POSIX 将 line 定义为

A sequence of zero or more non-newline characters plus a terminating newline character.

鉴于此,当 EOF/has 没有更多数据时,Linux 字符设备驱动程序的 read() 函数是否应该将 '\n' 添加到用户缓冲区?

字符驱动程序的概念类似于 stream。从这个角度来看,read 只是 return 下一个可用的东西。现在可用的通常是驱动程序所在设备定义的一部分。如果设备 return 是换行符,那么驱动程序也应该如此。请注意,这意味着设备将 return 在所有平台上换行,而不仅仅是 Linux。

一般来说,解释由 read 编辑的 return 字节是一个更高层次的抽象问题。在policy vs mechanism上,char driver可以认为是提供机制,把policy留给高层

在经典Unix中,字符设备和块设备的区别在于块设备支持寻道,这意味着它们是可寻址的,以固定大小的磁盘块为单位。字符设备不支持查找,它们只是传递或接受字符流。

在linux中,设备驱动程序被实现为结构,包含一些标志和参数以及函数指针的集合,为read()实现方法 /写()/等。块(磁盘)驱动程序还将实现 seek(),甚至可能实现 mmap()。

通常,设备驱动程序不会干扰正在传输的实际内容,它们只会移动字节或块 to/from 设备,使用设备需要的(硬件)协议(例如操纵内部控制寄存器,检查状态寄存器,...)