来自 termios 的手册页
termios 函数描述了用于控制异步通信端口的通用终端接口。
它们与 C 库中的 termios 数据类型一起实现,例如:libc 和 musl,而不是内核。
为什么会这样?为什么它们不像 uart 或其他内核接口那样在内核中实现?
该文档似乎表明它是为了操作系统独立性。 https://wiki.control.fel.cvut.cz/pos/cv5/doc/serial.html
关于 termios 结构,它说
切勿直接初始化 c_cflag(或任何其他标志)成员;您应该始终使用按位 AND、OR 和 NOT 运算符来设置或清除成员中的位。
不同的操作系统版本(甚至补丁)可以并且确实以不同的方式使用这些位,因此使用按位运算符将防止您破坏较新的串行驱动程序中所需的位标志。
提供 cfsetospeed 和 cfsetispeed 函数来设置 termios 结构中的波特率,无论底层操作系统接口如何。
但是我无法理解这个逻辑。
如果操作系统按照文档所述以不同的方式使用位,那么操作系统不是更适合了解位操作中使用的常量的值应该是什么吗?
我明白了。
用于设置 termios 成员的常量位仍然是 C 库层的一部分,以便为特定硬件的这些位的各种不同的操作系统相关使用提供一致的接口。
因此,termios api 最合适的位置是 C 库,其中该接口旨在通用,即跨(兼容 posix 的)操作系统可移植。
内核 uart 接口之类的东西提供了一个接口和一组驱动程序来与硬件通信,因此位于处理硬件细节的内核中。
我只是很难理解医生的表达方式。
对于那些可能会问自己同样问题或将 C 库部分集成到操作系统或内核中的人来说,很高兴知道。