[sisyphus] Q: Device data reading by several processes

Sergey Vlasov vsu на altlinux.ru
Пт Янв 22 11:34:12 UTC 2010


On Fri, Jan 22, 2010 at 07:27:41AM +0600, Michael Pozhidaev wrote:
> Прошу гуру просветить по такому делу: предположим читаем данные из
> устройства, можно предположить, что из /dev/input/... Всё хорошо
> читается. Что произойдёт, если операцию чтения будут выполнять
> одновременно (!) несколько процессов?
> 
> Где-нибудь задокументирована гарантия, что в такой ситуации данные
> получат точно все нуждающиеся процессы или этот момент на деле уже
> является случайным и чисто на удачу можно ждать, что что-то прочитается?
> 
> Экспериментально, вроде, всё выглядит так, что данные получают все
> процессы, но хочется знать, что это документированная возможность. 

С документацией всё, как обычно, сложно; реально /dev/input/event*
работают следующим образом:

 - При каждом открытии файла устройства для открытого файла создаётся
   буфер размером 64 события (реально из-за применённого способа
   организации кольцевого буфера могут сохраняться только 63 события).

 - Каждое событие ввода по умолчанию помещается в буфера для всех
   открытых файлов, причём проверки на переполнение буфера нет (при
   добавлении 64-го события в кольцевой буфер этот буфер становится
   пустым, и в дальнейшем начинает заполняться заново).

 - Если для одного из открытых файлов был выполнен вызов ioctl
   EVIOCGRAB, все дальнейшие события от устройства попадают только в
   буфер для этого файла (хотя открытие устройства не блокируется,
   прекращается только передача событий ввода - причём отключаются
   клиенты всех типов, не только /dev/input/event*).  Это делает,
   например, драйвер evdev в xorg (управляется через xorg.conf).

 - При выполнении read() для каждого файла читается содержимое
   собственного буфера, не зависящего от состояния других файлов.

Таким образом, одно устройство ввода могут использовать либо несколько
процессов совместно (в этом случае каждый из процессов получает все
события, которые успевает обрабатывать, но в случае, если из-за
несвоевременного чтения происходит переполнение буфера evdev для
одного из процессов, это не повлияет на другие), либо один процесс в
монопольном режиме.

Всё это относится к случаю, когда выполнялось несколько вызовов open()
для одного устройства.  Если же в вопросе имелась в виду ситуация,
когда несколько процессов используют один открытый файл (путём
передачи дескриптора открытого файла любым способом), каждое событие
будет возвращаться только одним из вызовов read() для этого файла,
каким именно - неизвестно.
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя     : отсутствует
Тип     : application/pgp-signature
Размер  : 189 байтов
Описание: Digital signature
Url     : <http://lists.altlinux.org/pipermail/sisyphus/attachments/20100122/4f322fd7/attachment.bin>


Подробная информация о списке рассылки Sisyphus