我有一个在 Linux 上以 root 身份运行的程序,与一个 tty(实际上是一个作为 tty 实现的 LCD)交谈。值得的设备是/dev/ttyUSB0。我希望写入此设备的程序能够独占访问该设备,以免受到同时运行的其他程序实例的任何干扰。
我看到有一个名为 TIOCEXCL 的 ioctl 选项,它可以防止设备的附加打开,“除非发出 TIOCEXCL ioctl,否则对同一文件的多个 open() 调用将成功。这将阻止除 root 拥有的进程之外的其他打开。 " 我对此进行了测试,它的工作原理与宣传的一样:如果非 root 用户尝试打开 /dev/ttyUSB0 (一旦我更改了权限),则打开失败并显示“设备忙”之类的内容,并且如果 root 用户尝试打开它, 有用。
我理想中想要的是一种对 tty 的独占访问权,以便为 root 用户工作。因此,我将有多个 root 用户使用写入 LCD 的程序,但不知何故,他们对 LCD (tty) 的访问将被序列化。显然 TIOCEXCL ioctl 选项对我不起作用,因为它不会阻止 root 用户打开已经打开的 tty 设备。
我想这里有很多选择,但我正在与大家联系,看看您是否有其他想法或建议。
也许我错过了使用 TIOCEXCL 的一些东西......
也许还有其他方法可以通过 open() 或 ioctl() 或其他方式获得独占访问。
如果有某种方法可以检测到其他进程打开了设备,我可以等待并重试。我知道 lsof 但我不愿意从这个程序内部调用它只是为了了解这一点。并且有竞争条件。(也许我可以克服它?:))
我可以像以前那样实现锁定,以获得对 tty 设备的独占访问权限。
更新1:
由于写入 LCD 设备的唯一程序是我的,因此我倾向于执行以下操作(伪代码)来锁定代码内部:
f = open("/dev/ttyUSB0", O_RDWR)
flock(f, LOCK_EX)
// do any ioctl's, etc.
// do any write's
// sleep a tad to not flash messages too fast on LCD
nanosleep({0, 250000000}, NULL)
flock(f, LOCK_UN)
close(f)