为什么termios在glibc中而不是内核中?

问题描述 投票:0回答:1

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 提供者知道?

linux glibc termios
1个回答
0
投票

搜索 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

© www.soinside.com 2019 - 2024. All rights reserved.