A portable code question
In the little fix I came up with for psql last night, I need to be able
to ensure that something sent to a pipe (and then to stdout) completes
before issuing the prompt directly to stdout.
I did this with: "system ('sleep 1');", but I'm fairly sure that is
not portable nor does it ENSURE completion.
What's the proper way to do this? And what's a good book on writing
portable code?
--
Mike Nolan
Assuming you're using file streams to write to the pipe, fflush() will do
the trick.
Show quoted text
-----Original Message-----
From: pgsql-hackers-owner@postgresql.org
[mailto:pgsql-hackers-owner@postgresql.org]On Behalf Of
nolan@celery.tssi.com
Sent: Thursday, June 26, 2003 2:20 PM
To: pgsql hackers list
Subject: [HACKERS] A portable code questionIn the little fix I came up with for psql last night, I need to be able
to ensure that something sent to a pipe (and then to stdout) completes
before issuing the prompt directly to stdout.I did this with: "system ('sleep 1');", but I'm fairly sure that is
not portable nor does it ENSURE completion.What's the proper way to do this? And what's a good book on writing
portable code?
--
Mike Nolan---------------------------(end of broadcast)---------------------------
TIP 8: explain analyze is your friend
Assuming you're using file streams to write to the pipe, fflush() will do
the trick.
The problem is that the pipe (from \o |tee xxxx) is intermingling writes
to stdout by tee with direct writes to stdout from within psql.
I do issue a fflush, because that's necessary to make the pipe do its
thing, but the next line of code also does a write to stdout and the pipe
generally doesn't have time to complete that write to stdout, resulting
in intermingled output. (fflush makes sure the pipe GETS the stream,
it doesn't wait around to make sure it's DONE with it, probably because
there's no way for whatever the pipe calls to report back when it is done.)
This is a bit of a hack, but adding an option to the \o code so that it
writes simultaneously to the pipe and to stdout instead of using tee
looks like a lot more work, especially since the code appears to have a
couple of other places where intermingling to stdout is possible,
especially if readline is used.
Throwing in "system('sleep 1');" was the way I resolved the timing
question here, but that may not be portable enough for inclusion into
the code base.
--
Mike Nolan