可以同时从多个进程打开 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。
我必须确保 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。