in reply to Non-blocking Reads from Pipe Filehandle

Win32::Socketpair creates pipes that go over TCP and so, can be used inside a select loop.

Unfortunately, some windows applications do not work when their stdin and stdout are connected to a socket (for instance, OpenSSH doesn't like it)!

Also, I believe that perl 5.10 already has a working socketpair function that does the same under the hood: using a TCP socket.

  • Comment on Re: Non-blocking Reads from Pipe Filehandle

Replies are listed 'Best First'.
Re^2: Non-blocking Reads from Pipe Filehandle
by BrowserUk (Patriarch) on Oct 01, 2008 at 09:01 UTC

    Cool! ++

    One thought. I have encountered an (occasional) situation where using ioctl($client, 0x8004667e, 1); fails.

    More reliable seems to be:

    my $true = 1; ioctl($client, 0x8004667e, \$true);

    The problem seems to be that under some, unspecified (and through my best efforts, untracable), circumstances, the 'system' (I haven't figured out what part of the system), attempts to write to the third parameter. And if that is a constant (or a reference to a constant, I used ioctl($client, 0x8004667e, \1); successfully for a while), then it cannot write to it and so it traps.

    See ioctlsocket Function(windows) and notice that the third parameter is defined as being __inout. Whether passing a reference to a rw SV* gets correctly translated, I'm not sure, but it doesn't seem to harm.

    Maybe that would 'fix' the problem with OpenSSH?


    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority".
    In the absence of evidence, opinion is indistinguishable from prejudice.