我有一个在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]独家模式问题可以帮到你!
也许这个关于LKML的讨论:[TTY]独家模式问题可以帮到你!