【发布时间】:2009-03-27 22:22:07
【问题描述】:
我有一个在 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)
【问题讨论】:
-
我想到的第一个(有点愚蠢;))问题是,你真的需要以 root 身份运行吗?或者只需要对您可以 sudo 或使用 setuid 权限的其他内容的 root 访问权限?
-
另见内核新手邮件列表中的How to make /dev/ttyACM0 (and friends) exclusive?。