我必须确保linux上的tty设备只能同时从一个实例访问。为此,我实现了一个flock()函数。然而,在我的测试中,即使没有flock()逻辑,我也无法同时从另一个进程打开串口。
我现在想知道这是否是所有情况下的正常行为,所以我可以删除我的flock()逻辑并依赖阻塞的open()逻辑?在任何情况下都可以同时从不同的实例打开串口吗?
编辑:
我已经发现,在没有flock()逻辑的情况下,同时多次打开tty端口是可能的。但是,open()函数似乎由于flock()而被阻塞。
发布于 2017-07-26 22:16:03
通常,可以从多个进程同时打开一个串行设备。
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(),
ioctl(fd, TIOCNXCL);函数需要包括<sys/ioctl.h>,常量需要包含<termios.h>。
许多Linux串行库已经这样做了。有些串行驱动程序一次也只能打开一个,因此要确定您所看到的行为的原因,我需要更多的详细信息(您如何打开串行设备,特别是使用的串行设备驱动程序)。
就个人而言--我确实相信大多数Linux串行库都是这样做的--我建议您尝试ioctl(fd, TIOCEXCL),如果它失败可能会警告用户(如果成功返回0,否则返回-1 );在所有情况下,使用ioctl(fd, TIOCNXCL); close(fd);关闭tty。
https://stackoverflow.com/questions/45336300
复制相似问题