in reply to Checing presence of input on standard input in non-blocking way, sans user interaction

I have posted this here because I had in the past implemented<>this using different approaches and none where to my satisfaction (made by me :-), I know this is a rather old post, yet this problem is rather difficult one otherwise and the code is almost self explanatory. It is based on sysread almost word for word from the perl cookbook or programming perl, the blocking factor is set to 2 bytes, in the event I want port this to win 32 'CRLF'.
sub getcmd { my $cin=''; my $buf=''; my $len=0; my @cin=(); local $/=undef; while ($RUN) { print(STDERR ' '); $buf=''; $len=0; while ($len=sysread(STDIN,$buf,2)) { if (! defined($len)) { next if ($! =~ /^Interrupted/); fatal(0xff,"system read fault",$!); } $cin.=$buf; last if (rindex($buf,"\n",0) > -1); } chomp($cin); if ($cin) { @cin=split(/\s+/,$cin); print(STDERR "CIN: $cin\n") if $VRB; last; } else { $RUN--; unless ($RUN) { print(STDERR "EXIT: timeout no activity\n") if $VRB; print(0x11); } sleep 1 } } return(@cin); }
  • Comment on Re: Checing presence of input on standard input in non-blocking way, sans user interaction
  • Download Code

Replies are listed 'Best First'.
Re^2: Checing presence of input on standard input in non-blocking way, sans user interaction
by wet (Initiate) on May 25, 2015 at 07:00 UTC
    in my haste - forgot to add, you need to do this before the call to getcmd(). this is from the standard Fcntl package and the sets the file handle to non blocking by adding to the flags, you can reset the flag afterwards.
    
    fcntl(STDIN, F_GETFL, $flg) or die("Couldn't get flags for HANDLE : $!\n"); fcntl(STDIN, F_SETFL, ($flg | O_NONBLOCK)) or die("Couldn't set flags for HANDLE: $!\n");