ALT Linux Sisyphus discussions
 help / color / mirror / Atom feed
From: Sergey Vlasov <vsu@altlinux.ru>
To: sisyphus@lists.altlinux.org
Subject: Re: [sisyphus] Q: Device data reading by several processes
Date: Fri, 22 Jan 2010 14:34:12 +0300
Message-ID: <20100122113412.GB4905@newmaster.mivlgu.local> (raw)
In-Reply-To: <m37hrbnd2q.fsf@blard.localdomain>

[-- Attachment #1: Type: text/plain, Size: 2527 bytes --]

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() для этого файла,
каким именно - неизвестно.

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 189 bytes --]

  parent reply	other threads:[~2010-01-22 11:34 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-01-22  1:27 Michael Pozhidaev
2010-01-22  9:04 ` Dmitry Chistikov
2010-01-22 11:34 ` Sergey Vlasov [this message]
2010-01-22 13:11   ` Michael Pozhidaev

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20100122113412.GB4905@newmaster.mivlgu.local \
    --to=vsu@altlinux.ru \
    --cc=sisyphus@lists.altlinux.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

ALT Linux Sisyphus discussions

This inbox may be cloned and mirrored by anyone:

	git clone --mirror http://lore.altlinux.org/sisyphus/0 sisyphus/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 sisyphus sisyphus/ http://lore.altlinux.org/sisyphus \
		sisyphus@altlinux.ru sisyphus@altlinux.org sisyphus@lists.altlinux.org sisyphus@lists.altlinux.ru sisyphus@lists.altlinux.com sisyphus@linuxteam.iplabs.ru sisyphus@list.linux-os.ru
	public-inbox-index sisyphus

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://lore.altlinux.org/org.altlinux.lists.sisyphus


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git