ALT Linux Sisyphus discussions
 help / color / mirror / Atom feed
* [sisyphus] Q: read()/write() operations of exact size
@ 2010-01-15 23:57 Michael Pozhidaev
  2010-01-16  0:25 ` Kirill A. Shutemov
  0 siblings, 1 reply; 5+ messages in thread
From: Michael Pozhidaev @ 2010-01-15 23:57 UTC (permalink / raw)
  To: sisyphus

Привет всем!

Вот два симметричных вопроса: предположим надо по трубе записать и
прочитать некоторую структуру известного размера, как сделать так, чтобы
быть уверенным, что она запишется сразу полностью и прочитается сразу
полностью?

Насчёт прочитать наткнулся на ioctl(fd, FIONREAD), который говорит,
сколько данных доступно для чтения. Как быть уверенным, что ядро не
захочет писать структуру из, скажем , семи байт порциями по два-три
байта? ННеохота каждый write() оборачивать в цикл. Ну уж как-то это
очень коряво получается.
-- 
Michael Pozhidaev. Tomsk, Russia.
E-mail: msp@altlinux.ru
Info: http://www.marigostra.ru/



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

* Re: [sisyphus] Q: read()/write() operations of exact size
  2010-01-15 23:57 [sisyphus] Q: read()/write() operations of exact size Michael Pozhidaev
@ 2010-01-16  0:25 ` Kirill A. Shutemov
  2010-01-16  0:45   ` Michael Pozhidaev
  0 siblings, 1 reply; 5+ messages in thread
From: Kirill A. Shutemov @ 2010-01-16  0:25 UTC (permalink / raw)
  To: ALT Linux Sisyphus discussions

2010/1/16 Michael Pozhidaev <msp@altlinux.ru>:
> Привет всем!
>
> Вот два симметричных вопроса: предположим надо по трубе записать и
> прочитать некоторую структуру известного размера, как сделать так, чтобы
> быть уверенным, что она запишется сразу полностью и прочитается сразу
> полностью?
>
> Насчёт прочитать наткнулся на ioctl(fd, FIONREAD), который говорит,
> сколько данных доступно для чтения. Как быть уверенным, что ядро не
> захочет писать структуру из, скажем , семи байт порциями по два-три
> байта? ННеохота каждый write() оборачивать в цикл. Ну уж как-то это
> очень коряво получается.

Перечитайте man 2 read и man 2 write ещё раз и напишите себе обёртки,
которые делают всё что вы хотите.

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

* Re: [sisyphus] Q: read()/write() operations of exact size
  2010-01-16  0:25 ` Kirill A. Shutemov
@ 2010-01-16  0:45   ` Michael Pozhidaev
  2010-01-16  0:57     ` Dmitry V. Levin
  0 siblings, 1 reply; 5+ messages in thread
From: Michael Pozhidaev @ 2010-01-16  0:45 UTC (permalink / raw)
  To: ALT Linux Sisyphus discussions

Hello, Kirill A. Shutemov!

> Перечитайте man 2 read и man 2 write ещё раз и напишите себе обёртки,
> которые делают всё что вы хотите.

Надёжного метода, кроме того, чтобы везде всё брать в цикл не
существует.

1. Да?
2. Нет?

read() говорит, что если прочиталось меньше ожидаемого, то это
OK. write() этот случай в мане не упоминает.

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



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

* Re: [sisyphus] Q: read()/write() operations of exact size
  2010-01-16  0:45   ` Michael Pozhidaev
@ 2010-01-16  0:57     ` Dmitry V. Levin
  2010-01-16  1:05       ` Michael Pozhidaev
  0 siblings, 1 reply; 5+ messages in thread
From: Dmitry V. Levin @ 2010-01-16  0:57 UTC (permalink / raw)
  To: ALT Linux Sisyphus discussions

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

On Sat, Jan 16, 2010 at 06:45:03AM +0600, Michael Pozhidaev wrote:
> 
> > Перечитайте man 2 read и man 2 write ещё раз и напишите себе обёртки,
> > которые делают всё что вы хотите.
> 
> Надёжного метода, кроме того, чтобы везде всё брать в цикл не
> существует.

Не существует, short read и short write надо всегда иметь в виду.

Есть готовые проверенные обёртки, см. напр.
http://git.altlinux.org/people/ldv/packages/?p=hasher-priv.git;a=blob;f=hasher-priv/fds.c#l134
http://git.altlinux.org/people/ldv/packages/?p=hasher-priv.git;a=blob;f=hasher-priv/child.c#l70

Ну и, конечно, есть стандартные fread(3) и fwrite(3).


-- 
ldv

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

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

* Re: [sisyphus] Q: read()/write() operations of exact size
  2010-01-16  0:57     ` Dmitry V. Levin
@ 2010-01-16  1:05       ` Michael Pozhidaev
  0 siblings, 0 replies; 5+ messages in thread
From: Michael Pozhidaev @ 2010-01-16  1:05 UTC (permalink / raw)
  To: ALT Linux Sisyphus discussions

Hello, Dmitry V. Levin!

> On Sat, Jan 16, 2010 at 06:45:03AM +0600, Michael Pozhidaev wrote:
>
> Не существует, short read и short write надо всегда иметь в виду.

Да, спасибо! Именно в этом хотел убедиться.


>
> Есть готовые проверенные обёртки, см. напр.
> http://git.altlinux.org/people/ldv/packages/?p=hasher-priv.git;a=blob;f=hasher-priv/fds.c#l134
> http://git.altlinux.org/people/ldv/packages/?p=hasher-priv.git;a=blob;f=hasher-priv/child.c#l70
>
> Ну и, конечно, есть стандартные fread(3) и fwrite(3).

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



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

end of thread, other threads:[~2010-01-16  1:05 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-01-15 23:57 [sisyphus] Q: read()/write() operations of exact size Michael Pozhidaev
2010-01-16  0:25 ` Kirill A. Shutemov
2010-01-16  0:45   ` Michael Pozhidaev
2010-01-16  0:57     ` Dmitry V. Levin
2010-01-16  1:05       ` 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