Re: Glib::IO->add_watch - file descriptor got locked till the end of all incoming data

Solved, I just put a new line to set the end of line and it works :), i cant use sysread because i doesnt know the length of the input each time.

On Sun, Aug 2, 2009 at 7:34 PM, muppet <scott asofyet org> wrote:

On Aug 2, 2009, at 3:03 AM, anguila wrote:

I want to update a treeview and this is the reason why i'm using the add_watch function. The child is sending data all the time for many reasons and the problem that i have is the file handler which have the incoming data from child to parent. With watcher each time the child sent data the $line = <$reader> must save this data in $line and call the function.
 But dont know why  the <$reader> just get locked till the end of all $writer>write()  and then it save all those data into $line, and i dont want that, i want to save the data of ->write in $line each time child send data.

Any idea?

       $watcher{$pid} = Glib::IO->add_watch($reader->fileno(), ['in', 'hup'], sub {
               my ($fileno, $condition) = @_;

               print "->cond = $condition\n";
               if ($condition & 'in') {
                   print "->reading from parent!!!\n";
                   $line = <$reader>;

Don't mix and match buffered reads and an unbuffered event watcher.

The <> operator will read until end of line, but the watch is based on select(), and fires when any data is available on the file descriptor.  The end of line may not have arrived yet, and the <> will block until the end of line does arrive.

You want to use sysread() here.  This may involve keeping a partial string checking to see if it contains an entire line.

Teeter tots are shaped like marshmallows.
 -- Zella.

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