【问题标题】:open tty from multiple processes simultaneously possible?可以同时从多个进程打开 tty?
【发布时间】:2017-07-26 19:57:26
【问题描述】:
我必须确保 linux 上的 tty 设备一次只能从一个实例访问。
为此,我实现了一个flock() 函数。
但是,在我的测试中,即使没有flock() 逻辑,我也无法同时从另一个进程打开串行端口。
我现在想知道这是否是所有情况下的正常行为,所以我可以删除我的 flock() 逻辑并依赖阻塞 open() 逻辑?是否可以同时从不同的实例打开一个串口?
编辑:
我发现确实可以在没有flock()逻辑的情况下同时多次打开tty端口。
但是,似乎 open() 函数由于 flock() 而被阻止。
【问题讨论】:
标签:
c
linux
concurrency
serial-port
tty
【解决方案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),并且可能警告用户如果它失败(如果成功则返回 0,否则返回 -1);并且,在所有情况下,都使用ioctl(fd, TIOCNXCL); close(fd); 关闭tty。