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