可以同时从多个进程打开 tty 吗?

open tty from multiple processes simultaneously possible?

我必须确保 linux 上的 tty 设备一次只能从一个实例访问。 为此,我实现了 flock() 函数。 但是,在我的测试中,即使没有 flock() 逻辑,我也无法同时从另一个进程打开串行端口。

我现在想知道这是否是所有情况下的正常行为,所以我可以删除我的 flock() 逻辑并依赖阻塞 open() 逻辑?在任何情况下都可以同时从不同实例打开串口吗?

编辑:

我发现确实可以在没有 flock() 逻辑的情况下同时多次打开 tty 端口。 但是,似乎 open() 函数由于 flock().

而被阻止

通常情况下,可以同时从多个进程打开串口设备。

您可以使用 TIOCEXCL ioctl() 获得独占访问权限:

if (!ioctl(fd, TIOCEXCL)) {
    /* Any further open() on the tty
       that is currently open on descriptor fd
       will fail with errno == EBUSY
       (except for the administrator, with the 
        CAP_SYS_ADMIN capability) */
}

并重新允许其他 open()s,

ioctl(fd, TIOCNXCL);

您需要为函数包括 <sys/ioctl.h>,为常数包括 <termios.h>

许多Linux 系列库已经这样做了。某些串行驱动程序也可能一次只允许打开一个,因此要确定您所看到的行为的原因,我需要更多详细信息(您如何打开串行设备,以及使用的串行设备驱动程序,在特别的)。

就我个人而言——我相信这是大多数 Linux 串行库所做的——我建议你 尝试 ioctl(fd, TIOCEXCL),并且 maybe 如果失败则警告用户(如果成功则 returns 0,否则 -1);并且在所有情况下,使用 ioctl(fd, TIOCNXCL); close(fd); 关闭 tty。