From: Jilles Tjoelker <jilles@stack.nl>
To: Jonathan Nieder <jrnieder@gmail.com>
Cc: Cristian Ionescu-Idbohrn <cristian.ionescu-idbohrn@axis.com>,
Herbert Xu <herbert@gondor.apana.org.au>,
dash@vger.kernel.org, 595063@bugs.debian.org
Subject: Re: read() builtin doesnt read integer value /proc files (but bashs does)
Date: Sat, 18 Dec 2010 23:23:44 +0100 [thread overview]
Message-ID: <20101218222344.GB50651@stack.nl> (raw)
In-Reply-To: <20101215185551.GA22905@burratino>
On Wed, Dec 15, 2010 at 12:55:51PM -0600, Jonathan Nieder wrote:
> Cristian Ionescu-Idbohrn wrote:
> > On Sun, 28 Nov 2010, Herbert Xu wrote:
> > > On Sat, Sep 04, 2010 at 07:35:04PM +0000, Jilles Tjoelker wrote:
> >>> This discarding is still bad as it throws away valid data if the open
> >>> file description is shared. This happens if stdin is redirected inside a
> >> I'm with Jilles on this. I also don't particularly feel like
> >> bloating dash just because of the borked /proc interface when
> >> there is a perfectly adequate work-around in "cat".
> >> value=$(cat /proc/file)
> > I wouldn't call that "a perfectly adequate work-around", but a painful and
> > unadequate work-around.
> For what it's worth, here's what bash does (based on strace):
> 1. Determine whether the file is seekable. That is, seek using
> SEEK_CUR with offset 0.
> 2. If seekable, read a nice big chunk and then seek back to put the
> file offset back in the right place. If not seekable, read one byte
> at a time.
> This works in /proc because files in /proc are seekable.
> That said, I don't think borked /proc is a great reason to do this
> (it's a better reason to fix /proc). Speeding up the read builtin
> might be a good reason.
The optimization is of limited benefit (still way more syscalls than
strictly necessary) and does not apply to the common use case of reading
from a pipe. Generally, if 'read' is too slow, it is better to spend a
fork on a tool like grep, sed or awk which processes large amounts of
text much more efficiently.
As for value=$(cat /proc/file), there are at least two ways to make this
faster. The traditional ksh way is the extension value=$(</proc/file)
which is permitted but not required by POSIX. I do not really like this
as it makes the scripts not POSIX compliant. In recent mksh I noticed
another way: by making cat(1) a builtin under certain circumstances.
These circumstances include the absence of options (other than "--") and
should probably also exclude foreground commands in interactive job
control shells (as builtins cannot be suspended). To avoid needing to
implement extensions like FreeBSD cat's ability to read from Unix domain
sockets, named files could also be excluded, requiring value=$(cat
</proc/file).
--
Jilles Tjoelker
next prev parent reply other threads:[~2010-12-18 22:24 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-09-01 8:10 read() builtin doesn't read integer value /proc files (but bash's does) Steve Schnepp
2010-09-02 15:02 ` Steve Schnepp
2010-09-03 21:25 ` Jilles Tjoelker
2010-09-04 18:20 ` Steve Schnepp
2010-09-04 19:35 ` Jilles Tjoelker
2010-11-28 8:42 ` Herbert Xu
2010-12-15 9:49 ` read() builtin doesnt read integer value /proc files (but bashs does) Cristian Ionescu-Idbohrn
2010-12-15 18:55 ` Jonathan Nieder
2010-12-15 19:12 ` Cristian Ionescu-Idbohrn
2010-12-18 22:23 ` Jilles Tjoelker [this message]
2010-09-02 19:09 ` read() builtin doesn't read integer value /proc files (but bash's does) Jilles Tjoelker
2010-09-03 9:23 ` Steve Schnepp
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=20101218222344.GB50651@stack.nl \
--to=jilles@stack.nl \
--cc=595063@bugs.debian.org \
--cc=cristian.ionescu-idbohrn@axis.com \
--cc=dash@vger.kernel.org \
--cc=herbert@gondor.apana.org.au \
--cc=jrnieder@gmail.com \
/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
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox