Accept / Connect will block using threads and UNIX domain sockets

[email protected] (Sebastian Weber) Tue, 23 Jan 2007 21:57:12 +0100
Newsgroups perl.ithreads
Message-ID <[email protected]>
Hi All,

The following code sets up a UNIX domain socket server 
<http://www.experts-exchange.com/Programming/Programming_Languages/Perl/Q_22001649.html#> 
and connects to that server in a different thread. I found the following 
code using threads to block forever - ist blocks exactly at the connect 
/ accept calls:

#!/usr/bin/perl
use threads;
use Socket;

unlink ("/tmp/mysock");
$t=threads->create("con_thread");

socket (SOCK1,PF_UNIX,SOCK_STREAM,0) or die "socket(): $!";
bind (SOCK1, sockaddr_un("/tmp/mysock")) or die "bind(): $!";
listen(SOCK1,SOMAXCONN) or die "listen(): $!";
accept (CLIENT,SOCK1);
$t->join();

sub con_thread {
     sleep(2);
     socket(SOCK2, PF_UNIX, SOCK_STREAM, 0) or die "socket(): $!";
     connect(SOCK2, sockaddr_un("/tmp/mysock")) or die "connect(): $!";
}

Whereas the same code will not block using fork():

#!/usr/bin/perl
use threads;
use Socket;

unlink ("/tmp/mysock");
if (fork) {con_thread();exit;}

socket (SOCK1,PF_UNIX,SOCK_STREAM,0) or die "socket(): $!";
bind (SOCK1, sockaddr_un("/tmp/mysock")) or die "bind(): $!";
listen(SOCK1,SOMAXCONN) or die "listen(): $!";
accept (CLIENT,SOCK1);

sub con_thread {
     sleep(2);
     socket(SOCK2, PF_UNIX, SOCK_STREAM, 0) or die "socket(): $!";
     connect(SOCK2, sockaddr_un("/tmp/mysock")) or die "connect(): $!";
}

Does anybody have any idea why?? Is there a workaround?
BTW: Im using Perl v5.8.7 built for cygwin-thread-multi-64int

Greets, Sebastian



	
		
___________________________________________________________ 
Der frühe Vogel fängt den Wurm. Hier gelangen Sie zum neuen Yahoo! Mail: http://mail.yahoo.de