Re: Confused by sysread()
On Mon, Apr 09, 2012 at 02:52:10PM -0700, Yitzchak Scott-Thoennes wrote: >You've probably switched from perl using stdio to using perlio. The perl I have certainly has USE_PERLIO set. >You >could compile 5.10.1 with usestdio to see if that makes a difference. >Or you could try a newer perl and see if this is a bug that perhaps >has been fixed? Oh dear. I could, but it's rather a slog. >Which strikes a vague bell...does it help to say: my $data = ''; No. Nor to initialise it to the size of the buffer. R
Re: Confused by sysread()
On Mon, Apr 9, 2012 at 2:52 PM, Yitzchak Scott-Thoennes wrote: > Which strikes a vague bell... Sorry, ring bells, strike chords.
Re: Confused by sysread()
On Mon, Apr 9, 2012 at 2:32 PM, Roger Burton West wrote: > Under Linux amd64 and Perl 5.10.1, I'm trying to read from a pair of > devices which will produce data in 16-byte blocks. (I can cat the device > files - as the same user - and verify that they do this.) > > Under Perl 5.8 (and an earlier i386 Linux), this worked. Now sysread() > is failing with an "Invalid argument". You've probably switched from perl using stdio to using perlio. You could compile 5.10.1 with usestdio to see if that makes a difference. Or you could try a newer perl and see if this is a bug that perhaps has been fixed? Which strikes a vague bell...does it help to say: my $data = '';
Confused by sysread()
Under Linux amd64 and Perl 5.10.1, I'm trying to read from a pair of devices which will produce data in 16-byte blocks. (I can cat the device files - as the same user - and verify that they do this.) Under Perl 5.8 (and an earlier i386 Linux), this worked. Now sysread() is failing with an "Invalid argument". I'm using an IO::Select thus, where @dev contains the device filenames: my $s=IO::Select->new; my @fh; foreach my $device (@dev) { my $fh; open $fh,'<',$device; binmode $fh; $s->add(\*$fh); push @fh,$fh; } while (1) { my @ready=$s->can_read(0.5); foreach my $fh (@ready) { my $data; my $y=sysread $fh,$data,16; die $! unless defined $y; # do stuff with $data } } I can change the open to sysopen $fh,$device,O_RDONLY; with no change in the result; if I add O_DIRECT, the @ready list never gets filled at all. Have I missed something important somewhere? Roger