同时从多个进程打开tty可能吗?

时间:2017-07-26 19:57:27

标签: c linux concurrency serial-port tty

我必须确保linux上的tty设备只能同时从一个实例访问。 为此,我实现了flock()功能。 但是,在我的测试中,即使没有flock()逻辑,我也无法同时从另一个进程打开串口。

我现在想知道这是否是所有情况下的正常行为,所以我可以删除flock()逻辑并依赖阻塞open()逻辑?在任何情况下都可以同时从不同的实例打开串口吗?

编辑:

我已经发现,确实可以在没有flock()逻辑的情况下同时多次打开tty端口。 但是,似乎open()功能因flock()而被阻止。

1 个答案:

答案 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。