in reply to Re^11: Is there a problem with IPC::Open on Windows 7?
in thread Is there a problem with IPC::Open on Windows 7?

sub _mswin_pipe { my ( $read, $write ) = IO::Socket->socketpair( AF_UNIX, SOCK_STREAM, PF_UNSPEC );

Are you running this code directly under windows or via some *nix emulation layer (eg.cygwin)?

Because I've never seen sockets in the AF_UNIX domain created under windows.


With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
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.

Replies are listed 'Best First'.
Re^13: Is there a problem with IPC::Open on Windows 7?
by glasswalk3r (Friar) on Aug 15, 2013 at 12:09 UTC

    Nowadays I'm running this code in Linux and Windows 7, so no emulation here. :-)

    I still trying to understand this trick of using sockets instead of filehandles in Windows to be able to do select without blocking. It seems it solves the problem of blocking, but now I'm having other types of problem. Meanwhile, I will try to answer your question by quoting the same book that is helping me out (Network Programming with Perl from Lincoln D. Stein):

    • about Socket's domain, page 63
    • AF_UNIX is used for interprocess communication within a single host. The name AF_UNIX is unfairly UNIX-specific; it's possible for non-UNIX systems to implement it. For this reason, POSIX has tried to rename this constant AF_LOCAL, although few systems have followed suit.
    • About socketpair, page 101:
    • While in principle socketpair can be used for INET protocol, in practice most systems only support socketpair for creating UNIX-domain sockets.

    Of course, I didn't know about those details before researching. As I said before, I just copied the related code and tried to adapt it to my needs.

    End of story: after disabling shutdown, the application (srvrmgr.exe) that I'm executing with open3 started behaving correctly (can be reused several times), but waitpid is not being able to kill it later: it was necessary to invoke kill 9 to do the job.

    Strange as it seems, running a external process as the Perl script that is shipped with Siebel::Srvrmgr works fine with waitpid in Windows and Linux.

    I had updated the SVN repository if you want to take a look.

    Alceu Rodrigues de Freitas Junior
    ---------------------------------
    "You have enemies? Good. That means you've stood up for something, sometime in your life." - Sir Winston Churchill

      Further, the WinSock2 docs make no mention of AF_UNIX.

      And my attempt to use it compiles clean, but results in a runtime error (as expected):

      #include <winsock2.h> #include <ws2tcpip.h> #include <stdio.h> int main( int argc, char **argv ) { WSADATA wsaData = {0}; int iResult = 0; SOCKET sock = INVALID_SOCKET; if( WSAStartup(MAKEWORD(2, 2), &wsaData) != 0 ) { printf( "WSAStartup failed: %d\n", iResult); return 1; } sock = socket( AF_UNIX, SOCK_DGRAM, IPPROTO_TCP ); if( sock == INVALID_SOCKET ) printf( "socket function failed with error = %d\n", WSAGetLast +Error() ); else { printf( "socket function succeeded\n" ); iResult = closesocket( sock ); if( iResult == SOCKET_ERROR ) { printf( "closesocket failed with error = %d\n", WSAGetLast +Error() ); WSACleanup(); return 1; } } WSACleanup(); return 0; }

      Compile/link/run/error:

      C:\test>cl /W3 unixDomainSockets.c Ws2_32.lib Microsoft (R) C/C++ Optimizing Compiler Version 15.00.21022.08 for x64 Copyright (C) Microsoft Corporation. All rights reserved. unixDomainSockets.c Microsoft (R) Incremental Linker Version 9.00.21022.08 Copyright (C) Microsoft Corporation. All rights reserved. /out:unixDomainSockets.exe unixDomainSockets.obj Ws2_32.lib C:\test>unixDomainSockets.exe socket function failed with error = 10047 C:\test>perl -E"say $^E=10047" An address incompatible with the requested protocol was used

      So, quite how you are getting away with using *nix domain sockets on Windows I have no idea; but I think that it is more by luck than judgement and probably not doing what you think it is.


      With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
      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.

        Strangely enough, the documentation from Microsoft does not mention neither any domain for some sort of interprocess communication within a single host. Maybe Perl does some sort of emulation when using socketpair in Windows?

        Further testing, even when avoiding using shutdown in the sockets/filehandles the application returns ECONNRESET.

        Is it possible to use Windows named pipes to do the same trick with select? Looks like I'm running out of options.

        UPDATED: just for testing, I changed the code:

        sub _mswin_pipe { my ( $read, $write ) = IO::Socket->socketpair( AF_UNIX, SOCK_STREAM, PF_UNSPEC );

        to:

        sub _mswin_pipe { my ( $read, $write ) = IO::Socket->socketpair( AF_INET, SOCK_STREAM, PF_UNSPEC );

        The result was a disaster: the external program was executed once, communication with the parent process was lost and (since my code is designed to try to fork new children) a lot of srvrmgr.exe were opened.

        Alceu Rodrigues de Freitas Junior
        ---------------------------------
        "You have enemies? Good. That means you've stood up for something, sometime in your life." - Sir Winston Churchill
      The name AF_UNIX is unfairly UNIX-specific; it's possible for non-UNIX systems to implement it.

      Possible yes, but have MS actually done so? If so, when?

      Hm. I know I tried this years ago and got the same result as this guy.

      And the scant and unhelpful results I get from searching MS for AF_UNIX doesn't clarify anything. It appears in the header files, but there are no examples and no discussion of using it.

      When I get time and motivation I'll dip into C and play, see what I find.

      At this point I have no experience or knowledge of this to offer you.


      With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
      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.