[Gllug] pipes and C++

Adrian McMenamin adrian at newgolddream.dyndns.info
Mon Sep 13 08:45:32 UTC 2010


On Sun, September 12, 2010 11:58 pm, Bruce Richardson wrote:
> On Sun, Sep 12, 2010 at 09:49:58PM +0100, Adrian McMenamin wrote:
>> I have been chaining three C++ programs I have written together -
>> working on the principle that each should do one thing - so
>>
>> A - generates some xml
>> B - processes said xml
>> C - outputs graphics
>>
>> A | B | C
>>
>> All works well - but now I want to have them repeat this every few
>> seconds ie for every three seconds
>>
>> A --r 3 | B --r 3 | C --r 3
>>
>> But while it is easy to get the first program to churn out the xml I
>> cannot work out how to get the second element in the chain to recognise
>> the end of the output - (I am guessing that previously B didn't really
>> start until A was dead?)
>
> No, that's not the case.  In fact, A and B run in parallel.  B reads
> from STDIN, which, since it directly connected to A's STDOUT, blocks
> until A writes to it.  Here's a little test you can run with two
> scripts:
>
> -------------- a.sh -----------------
> #!/bin/sh
> logfile=/tmp/test.log
> for output in 1 2 3 4 5 6 7 8 9 0; do
>   echo A: $output
>   echo A: $output >> $logfile
> done
>
> -------------- b.sh -----------------
> #!/bin/sh
> logfile=/tmp/test.log
> while read input; do
>   echo B: $input
>   echo B: $input >> $logfile
> done
>
>
> Now, if you run
>
> 	a.sh | b.sh
>
> and examine /tmp/test.log, what you will *not* find is all of a.sh's
> output followed by all of b.sh's output.
>
>
> Going back to your problem, in the first example, when A terminates it
> closes STDOUT.  Since the shell has diverted A's STDOUT to B's STDIN,
> this closes B's STDIN.  In your second example, A is not terminating and
> so STDOUT is not closed and so STDIN for B is not closed.  Simple as
> that.  You could close STDIN from within A, but then you will break the
> pipe between A and B and A will have no way to re-establish this, as it
> knows nothing of A; it only knows about STDOUT, which the shell has
> linked to B's STDIN.
>
>>
>> Is my naive way of doing this simply not going to work?
> > No, it can't.  (How did you get anywhere with C/C++ without learning
> about STDIN, STDOUT and pipes?


Well, I obviously did or else the non-repeating version wouldn't have
worked - as it reads two different types of serialised data going down the
chain. I just didn't learn *everything* about them :)



> You should remedy that.)  Since you're
> working with XML, can't process B recognise when its input is finished
> because it's received an entire XML document?  Surely unambiguous
> communication is what XML is all about?

I am using the Xerces DOM praser - I could switch to an event based parser
such as SAX then I could but that would involve a pretty substantial
rewrite.

>  (Stop laughing, you at the
> back).  A should produce as many documents as it is told to, then close
> STDOUT.  B should keep parsing documents (and doing whatever it does to
> produced output after each completed document) until STDIN closes.
>
> --
> Bruce
>
> What would Edward Woodward do?
> --
> Gllug mailing list  -  Gllug at gllug.org.uk
> http://lists.gllug.org.uk/mailman/listinfo/gllug
>


-- 
Gllug mailing list  -  Gllug at gllug.org.uk
http://lists.gllug.org.uk/mailman/listinfo/gllug




More information about the GLLUG mailing list