【问题标题】: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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-05
      • 1970-01-01
      相关资源
      最近更新 更多