Re: GIOChannel & Intercepting stdout



On Wed, 25 Aug 2010 12:31:53 +0200
richard boaz <ivor boaz gmail com> wrote:
[snip]
> My reading of GIOChannel functionality renders my usage understanding
> to be:
> 
>    - create a channel using the file descriptor (in this case
> STDOUT_FILENO)
>    - add a watch on the conditions of interest (in this case G_IO_IN)
>    - start the main loop
>    - read the data on the channel within my callback and process
> accordingly
> 
> Which, I think, would result in:
> 
>    - the callback being called with condition G_IO_IN whenever
> anything is written to stdout
> 
> Except that I don't experience anything close to this result.
> 
> Below is sample code demonstrating what I'm trying to achieve here,
> but basically, it:
> 
>    - creates a GIOChannel on stdout
>    - adds a watch on condition G_IO_IN
>    - adds an idle routine to write a message to stdout
>    - starts the main loop
> 
> As I said, what I would expect from this:
> 
>    - callback fired with condition G_IO_IN when idle call writes to
> stdout
> 
> However, when this executes, I get:
> 
>    - the test message output to the terminal (completely bypassing the
>    callback routine)
>    - the callback gets fired only after the <ENTER> key is hit on the
>    keyboard, with nothing to be read from the channel.  (huh?...)

This won't work.  file descriptor number 1 (stdout) is a file descriptor
you write to, not read from.

If you connect stdout to the write file descriptor of a pipe with
dup2(), and then connect your GIOChannel object to the read file
descriptor of the pipe, it should work.  Whether it does or not will
depend on the libraries which you say are writing to stdout.  If they
expect a terminal on stdout you may need to resort to pseudo-ttys.

Chris




[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]