musl 和 glibc 中的 cfsetospeed 函数只是将速度设置为 termios 结构体的 c_cflag 成员,尽管是在使用 CBAUD 进行一些位检查和操作之后。
这是 musl 实现
int cfsetospeed(struct termios *tio, speed_t speed)
{
if (speed & ~CBAUD) {
errno = EINVAL;
return -1;
}
tio->c_cflag &= ~CBAUD;
tio->c_cflag |= speed;
return 0;
}
为什么内核不能这样做?或者是打电话的人
CBAUD 平台特定吗? “依赖于实施”? 有些特殊值只有 libc 提供者知道?
搜索 CBAUD 找到了答案。 比较有趣。
似乎 CBAUD 只是设置 c_cflag 成员时使用的多种可能性之一
切勿直接初始化 c_cflag(或任何其他标志)成员;您应该始终使用按位 AND、OR 和 NOT 运算符来设置或清除成员中的位。不同的操作系统版本(甚至补丁)可以并且确实以不同的方式使用这些位......
提供 cfsetospeed(3) 和 cfsetispeed(3) 函数来设置 termios 结构中的波特率无论底层操作如何 系统界面。
c_cflag 成员的全文和常量表在这里 https://wiki.control.fel.cvut.cz/pos/cv5/doc/serial.html