当前位置:  开发笔记 > 运维 > 正文

从Linux上的根程序获得对tty设备的独占访问权限

如何解决《从Linux上的根程序获得对tty设备的独占访问权限》经验,为你挑选了1个好方法。

我有一个在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()或what-not获得独占访问权限.

    如果有某种方法我可以检测到某个其他进程打开了设备,我可以等待并重试.我知道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)

Johannes Wei.. 6

也许这个关于LKML的讨论:[TTY]独家模式问题可以帮到你!



1> Johannes Wei..:

也许这个关于LKML的讨论:[TTY]独家模式问题可以帮到你!

推荐阅读
小妖694_807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有