ALT Linux Sisyphus discussions
 help / color / mirror / Atom feed
* [sisyphus] Q: Device data reading by several processes
@ 2010-01-22  1:27 Michael Pozhidaev
  2010-01-22  9:04 ` Dmitry Chistikov
  2010-01-22 11:34 ` Sergey Vlasov
  0 siblings, 2 replies; 4+ messages in thread
From: Michael Pozhidaev @ 2010-01-22  1:27 UTC (permalink / raw)
  To: sisyphus

Привет всем!

Прошу гуру просветить по такому делу: предположим читаем данные из
устройства, можно предположить, что из /dev/input/... Всё хорошо
читается. Что произойдёт, если операцию чтения будут выполнять
одновременно (!) несколько процессов?

Где-нибудь задокументирована гарантия, что в такой ситуации данные
получат точно все нуждающиеся процессы или этот момент на деле уже
является случайным и чисто на удачу можно ждать, что что-то прочитается?

Экспериментально, вроде, всё выглядит так, что данные получают все
процессы, но хочется знать, что это документированная возможность. 

Всем спасибо!

-- 
Michael Pozhidaev. Tomsk, Russia. E-mail: msp@altlinux.ru
Info: http://www.marigostra.ru/



^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [sisyphus] Q: Device data reading by several processes
  2010-01-22  1:27 [sisyphus] Q: Device data reading by several processes Michael Pozhidaev
@ 2010-01-22  9:04 ` Dmitry Chistikov
  2010-01-22 11:34 ` Sergey Vlasov
  1 sibling, 0 replies; 4+ messages in thread
From: Dmitry Chistikov @ 2010-01-22  9:04 UTC (permalink / raw)
  To: ALT Linux Sisyphus discussions

В случае каналов, fifo и терминалов POSIX ничего не гарантирует:

$ man 3p read | grep -B1 concur
       The  read()  function  shall attempt to read nbyte bytes from
the file associated with the open file descriptor, fildes, into the
buffer
       pointed to by buf. The behavior of multiple concurrent reads on
the same pipe, FIFO, or terminal device is unspecified.

Насколько я понимаю, в общем случае определенности нет и все зависит
от устройства. (Прошу меня поправить, если ошибаюсь.)

-- 
Дмитрий Чистиков,
dd1email at gmail dot com

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [sisyphus] Q: Device data reading by several processes
  2010-01-22  1:27 [sisyphus] Q: Device data reading by several processes Michael Pozhidaev
  2010-01-22  9:04 ` Dmitry Chistikov
@ 2010-01-22 11:34 ` Sergey Vlasov
  2010-01-22 13:11   ` Michael Pozhidaev
  1 sibling, 1 reply; 4+ messages in thread
From: Sergey Vlasov @ 2010-01-22 11:34 UTC (permalink / raw)
  To: sisyphus

[-- 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 --]

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [sisyphus] Q: Device data reading by several processes
  2010-01-22 11:34 ` Sergey Vlasov
@ 2010-01-22 13:11   ` Michael Pozhidaev
  0 siblings, 0 replies; 4+ messages in thread
From: Michael Pozhidaev @ 2010-01-22 13:11 UTC (permalink / raw)
  To: ALT Linux Sisyphus discussions

Hello, Sergey Vlasov!

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

Сергей, в очередной раз блистательный ответ от Вас! Большое спасибо. Всё
понял. Осталось следить, чтобы никто не захотел монопольного доступа.

-- 
Michael Pozhidaev. Tomsk, Russia. E-mail: msp@altlinux.ru
Info: http://www.marigostra.ru/



^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2010-01-22 13:11 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-01-22  1:27 [sisyphus] Q: Device data reading by several processes Michael Pozhidaev
2010-01-22  9:04 ` Dmitry Chistikov
2010-01-22 11:34 ` Sergey Vlasov
2010-01-22 13:11   ` Michael Pozhidaev

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