Perl 5 and C have the select call that lets you determine which of a group
of file-descriptor are ready for reading and writing. I thought it might be
useful here.

https://en.wikipedia.org/wiki/Select_(Unix)

I've found a module by Tadzik, https://github.com/tadzik/IO-Select, but
it's looking defunct and Parrot specifc.

Are we missing a working 'select' call?
- David

On Fri, Jul 28, 2017 at 12:04 PM, Brandon Allbery <allber...@gmail.com>
wrote:

> On Thu, Jul 27, 2017 at 7:49 PM, Norman Gaywood <ngayw...@gmail.com>
> wrote:
>
>> my $input = q:to/EOS/;
>> line of text
>> another line
>> EOS
>>
>> my $cat  = run 'cat', '-n', :in($input.print), :out;
>> my $output = $cat.out.get;
>> $cat.in.close;
>> $cat.out.close;
>>
>> say "done";
>> say $output;
>>
>> But that is not correct. I seem to be missing something.
>>
>
> :in, :out, :err want a filehandle (or will create one if you specify True,
> which is what pair syntax gives you if you specify one of them without a
> filehandle). Not a string; and .print applied to a Str does not turn the
> string into a filehandle, it sends the string to the filehandle in $*OUT.
>
> my $cat = run 'cat', '-n', :in, :out;
> $cat.in.print($input); # this .print, on IO::Handle, prints the string to
> that handle
> $cat.in.close;
> my $output = $cat.out.slurp: :close;
>
> Note that you need to be very careful to avoid the "open3" deadlock: pipes
> have limited buffers, and if you do this all in one thread when the data is
> large enough to block on write, and the receiving program then blocks on
> write back to you, you will deadlock. No language can protect you from
> this. The solution is that either the writer or the reader (or both) needs
> to be in its own thread so that if one blocks, the other can keep running
> and eventually clear the block.
>
> --
> brandon s allbery kf8nh                               sine nomine
> associates
> allber...@gmail.com
> ballb...@sinenomine.net
> unix, openafs, kerberos, infrastructure, xmonad
> http://sinenomine.net
>

Reply via email to