2

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

实际上,要确定文件是 USB 串口还是平台串口,有一些方法可以使用可用的框架,例如libudev在 linux 或IOKit OSX 上。但我认为要检查PTY文件,唯一的方法是使用 good old 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 上发现PTSchardev 的主要模式都是 . 136,而在我的 OSX 上,所有 PTS 的模式都是16. 在ddg上爬,我发现Solaris可能使用主要模式24.

我可以在网上找到很多关于 PTY/PTS 及其历史的资源。openptyptypts的联机帮助页- 尽管给出了主要和次要的/dev/ptmx- 没有谈论PTS设备的主要/次要模式。并且没有资源列出跨单元的主要模式。

所以这是我的问题:

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

注意:我一直犹豫在unix.SE上发帖,但由于我在代码中使用它,我认为这更像是一个在这里问的问题,关于 SO。

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

4

1 回答 1

0

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

于 2014-10-28T22:08:58.833 回答