Chris Vine wrote:

On Wed, 20 Feb 2013 18:42:28 -0000
"William Orr" <[email protected]> wrote:
    > Chris Vine wrote:
    >
    >
    > On Tue, 19 Feb 2013 20:28:16 -0500
    > Will Orr <[email protected]> wrote:
    >     > Here[1] is the problematic code.
    >     >
    >     > I'm trying to run a command and gather the output and
    return
    >     code. I
    >     > do this by watching for the process to return, as well as
    >     waiting for
    >     > the channels to HUP. However, my callbacks never get
    called with
    >     cond
    >     > set to G_IO_HUP, even after the process terminates. Nor do
    any
    >     of the
    >     > g_io_channel_read_* calls return errors. This seems
    inconsistent
    >     with
    >     > the documentation, as well as examples that I've found in
    the
    >     hours of
    >     > researching this problem.
    >     >
    >     > I'm clearly doing something wrong, I'm just not sure where
    yet.
    >     Any
    >     > advice or solutions would be great. Thanks so much! Let me
    know
    >     if I
    >     > need to provide anymore information. Please CC me, as I'm
    not a
    >     member
    >     > of this list.
    >
    > This will help you:
    >
    > http://www.greenend.org.uk/rjk/2001/06/poll.html
    >
    > Chris
    >
    > Is this really preferable to using g_io_add_watch? It doesn't
    seem
    > like I can make use of that in my event loop…

I think you misunderstood me, and I can see that I was was overly
concise. g_poll() is a wrapper on unix-like OSes for poll().  The web
page to which I directed you explains why POLLHUP, and so G_IO_HUP, is
not a reliable indicator of end-of-file.

If you have received G_IO_HUP, you must have received a hang-up, which
means on a pipe file descriptor that you must have end-of-file.
However
the converse is not true.  You can have end-of-file without G_IO_HUP,
which is what you are experiencing.  You are receiving POLLIN/G_IO_IN
instead.

The only reliable way of detecting end-of-file is if read() returns 0.
This equates to one of the GIOChannel read functions returning a
GIOStatus value of G_IO_STATUS_EOF.  Your mistake was in not checking
return values.

I have not studied your code in detail but you do not seem to be
unref()ing consistently either, in particularly in a case of error.
The
best thing to do is to unref() the GIOChannel object as soon as you
have
called g_io_add_watch() or g_source_attach().  Then, returning FALSE
in
the callback will automatically release the object and its resources.

Chris

Thanks for the more verbose explanation; it helped me a lot. I'll try
this tonight and let you know how it fares.




—
William Orr
about.me/worr

_______________________________________________
gtk-list mailing list
[email protected]
https://mail.gnome.org/mailman/listinfo/gtk-list

Reply via email to