我必须确保linux上的tty设备只能同时从一个实例访问。
为此,我实现了flock()
功能。
但是,在我的测试中,即使没有flock()
逻辑,我也无法同时从另一个进程打开串口。
我现在想知道这是否是所有情况下的正常行为,所以我可以删除flock()
逻辑并依赖阻塞open()
逻辑?在任何情况下都可以同时从不同的实例打开串口吗?
编辑:
我已经发现,确实可以在没有flock()
逻辑的情况下同时多次打开tty端口。
但是,似乎open()
功能因flock()
而被阻止。
答案 0 :(得分:1)
通常,可以同时从多个进程打开串行设备。
您可以使用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)
,而也许警告user如果失败(如果成功则返回0,否则返回-1);并且,在所有情况下,使用ioctl(fd, TIOCNXCL); close(fd);
来关闭tty。