Beefy Boxes and Bandwidth Generously Provided by pair Networks
Don't ask to ask, just ask

comment on

( #3333=superdoc: print w/replies, xml ) Need Help??

The error code is in $!.
If a handle is set to non-blocking and there is no data present and a sysread returns undef, the error should be either EWOULDBLOCK or EAGAIN. Any thing else is a real error.
The error text you were seeing "Resource temporarily unavailable" was from EAGAIN.
sysread() ultimately calls the C function "read", see "man 2 read" for information about read errors includiung EAGAIN.

Setting $parent to non-blocking does not cause an error, did you mean $child ?

Another problem with your code is the sleep in the receiver section. If data arrives on the socket during that sleep, response will be delayed until that sleep completes. In general, there should be no sleeps in a receiver except for the timeout in can_read or select. This is why select() and IO::Select were invented!

In general, any attempt to use non-blocking should be avoided, and should require exceptional justification before it is allowed.

Following is a set of suggested "tweaks" for eliminating that problem and several others.

#!/usr/bin/perl use diagnostics; use strict 'subs'; use strict 'refs'; use Socket; use IO::Handle; use IO::Select; my $child; # filehandle to child process my $parent; # filehandle to parent process my $pid; # Process ID of child process # w r i t e L i n e # Writes a buffer to the filehandle. sub writeLine { my ($fh, $buf) = @_; print $fh $buf; # while( length $buf ) # alternate to yours, but single print is the + same # { # my $stat = syswrite $fh, $buf; # $stat and substr $buf, 0, $stat, ''; # } } #writeLine() socketpair($child, $parent, AF_UNIX, SOCK_STREAM, PF_UNSPEC) or die "socketpair: $!"; $child->autoflush(1); $parent->autoflush(1); if ($pid = fork()) { #parent close $parent or die "close: $!\n"; my $sel = IO::Select->new($child); my @handles; my $buf = ''; while ($sel->count) { # print STDOUT time%100, ": polling child\n"; for my $fh ( @handles = $sel->can_read(1) ) { if( sysread $fh, $buf, 1e6, length $buf ) { print STDOUT time%100, ": received <$1>\n" # because you may + get more while $buf =~ s/(.*)\n//; # than one line a +t a time } else { $sel->remove($fh); } } @handles or print STDOUT time%100, ": no input from child at thi +s time\n"; } my $stat = wait; die "wait returned $stat\n" unless $stat == $pid; print STDOUT time%100, ": child reaped, parent exiting\n"; exit 0; } else { die "cannot fork: $!" unless defined $pid; close $child or die "close: $!\n"; writeLine($parent, time%100 . ": child started\n"); sleep 4; writeLine($parent, time%100 . ": child wrote again\nwith two lines +\n"); sleep 2; writeLine($parent, "E_O_F\n"); close $parent or die "close: $!\n"; #causes termination print STDOUT time%100, ": child exiting\n"; exit; }

EDIT: removed overlooked ->blocking call.

In reply to Re^3: sysread blocking ?? by tybalt89
in thread sysread blocking ?? by azadian

Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post; it's "PerlMonks-approved HTML":

  • Are you posting in the right place? Check out Where do I post X? to know for sure.
  • Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
    <code> <a> <b> <big> <blockquote> <br /> <dd> <dl> <dt> <em> <font> <h1> <h2> <h3> <h4> <h5> <h6> <hr /> <i> <li> <nbsp> <ol> <p> <small> <strike> <strong> <sub> <sup> <table> <td> <th> <tr> <tt> <u> <ul>
  • Snippets of code should be wrapped in <code> tags not <pre> tags. In fact, <pre> tags should generally be avoided. If they must be used, extreme care should be taken to ensure that their contents do not have long lines (<70 chars), in order to prevent horizontal scrolling (and possible janitor intervention).
  • Want more info? How to link or or How to display code and escape characters are good places to start.
Log In?

What's my password?
Create A New User
Domain Nodelet?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others wandering the Monastery: (1)
As of 2022-10-01 17:21 GMT
Find Nodes?
    Voting Booth?
    My preferred way to holiday/vacation is:

    Results (3 votes). Check out past polls.