У меня есть программа, работающая от имени root в Linux, с tty (на самом деле LCD, реализованный как tty). Устройство для того, что он стоит, это / dev / ttyUSB0. Я хотел бы, чтобы моя программа, которая пишет на это устройство, имела эксклюзивный доступ к устройству, чтобы не создавать помех для других экземпляров программы, запущенных одновременно.
Я вижу, что есть опция ioctl под названием TIOCEXCL, которая не позволяет дополнительным открытиям устройства без «множественных вызовов open () к одному и тому же файлу, если не будет выполнен TIOCEXCL ioctl. Это предотвратит дополнительные открытия, кроме как с помощью собственные процессы. " Я проверил это, и оно работает так же, как рекламировалось: если пользователь без полномочий root пытается открыть / dev / ttyUSB0 (после того, как я изменил разрешения), то происходит сбой открытия с чем-то вроде «устройство занято», и если пользователь root пытается открыть его , это работает.
В идеале я хочу, чтобы этот привилегированный доступ к tty работал для пользователей root. Таким образом, у меня было бы несколько пользователей root, использующих программу, которая пишет на ЖК-дисплей, но каким-то образом их доступ к ЖК-монитору (tty) будет сериализован. Очевидно, опция TIOCEXCL ioctl не будет работать для меня, так как она не мешает корневым пользователям открывать уже открытое 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)