【问题标题】:How stable are major and minor mode of a chardev?chardev 的主要和次要模式有多稳定?
【发布时间】:2014-04-29 19:48:47
【问题描述】:

我正在开发一个串口库,我正在考虑使用主要/次要模式 字符设备检查给定文件是否为平台串口, pty 或 USB 串行端口,以补充使用下存在的其他框架 Linux 或 OSX。

其实就是判断一个文件是USB串口还是平台串口 端口,有一些方法可以使用可用的框架,例如 linux 上的 libudevIOKit 在 OSX 上。但我认为要检查PTY 文件,唯一的方法是使用旧的 stat():

#if defined(OS_LINUX)
#define PTY_MAJOR_NODE 136
#elif defined(OS_MAC)
#define PTY_MAJOR_NODE 16
#elif defined(OS_SOLARIS)
#define PTY_MAJOR_NODE 24
#endif

bool is_pty(const char* file) {
    struct stat filestat;
    if (0 == stat(file, &filestat)
            && S_ISCHR(filestat.st_mode)
            && major(filestat.st_rdev) == PTY_MAJOR_NODE) {
        return true;
    }
    return false;
}

到目前为止,我在我的 debian linux 上发现 PTS chardev 都有一个主要模式 136,在我的 OSX 上,所有 PTS 的模式都是 16。爬上ddg,我发现 Solaris 可能使用24. 的主要模式

我可以在网上找到很多关于什么是 PTY/PTS 及其历史的资源。 openptyptypts 的联机帮助页 - 尽管那个提供专业和 /dev/ptmx 的次要 - 不要谈论 PTS 设备的主要/次要模式。和不 资源列出了各个单元的主要模式。

所以这是我的问题:

  • 对于给定的 Unix 风格,PTS(以及扩展的其他串行 chardev)的主要模式是否稳定? (我正在寻找稳定在 ±2 年的东西)
  • 这些定义在哪里?我猜它是一个内核驱动程序来处理它,不是吗?
  • 依靠 chardev 的主要模式来检测这是什么类型的设备是个好主意吗?

N.B.:我一直犹豫是否要在 unix.SE 上发帖,但因为我正在使用它 在代码中,我认为这更像是一个要在这里问的问题。

编辑:我发布了一个相关的question on unix.SE 寻求帮助以查找其他主要模式,并查看它们在整个系统中的稳定性。我的猜测是,如果没有人知道答案,至少我们可以查询系统并查看来源。

【问题讨论】:

    标签: c unix serial-port pty chardev


    【解决方案1】:

    主要和次要设备编号在编译或链接/加载时定义,具体取决于所涉及的硬件。向 Solaris 机器添加额外的 SBUS 卡可能(必须?)具有任意主要设备号。我知道我的。
    简而言之,我认为主要/次要设备编号不会满足您的要求。
    考虑 Debian Linux 端口 https://www.debian.org/ports
    我无法想象 SPARC、s390、MIPS、PowerPC 和 ARM 架构都使用相同的主要/次要编号;总线架构太不同了。

    【讨论】:

    • 嗯,这肯定是在源代码中,要么在内核中定义,要么在模块中,具体取决于目标设备。在较新的 unix 系统中,您类似于 udev 的子系统分配模式,即使虚拟设备(如 PTY)是硬编码的并且根据系统具有不同的值。
    猜你喜欢
    • 2023-03-06
    • 2015-01-08
    • 2012-01-01
    • 2015-05-24
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 2017-06-15
    • 1970-01-01
    相关资源
    最近更新 更多