hi all,
I am having a problem with duping stdout and socket. When my client forks of children,
the childrens stdout is then duped with a socket. Which is what I want, but for some
reason the parents stdout gets redirected as well. I want the parents STDOUT to stay
the same and only redirect childs stdout. Am I missing something or forgeting
something ??
thanx,
Mark
_____paste server_____
use Socket qw(:DEFAULT :crlf);
use IO::Handle;
use Fcntl;
use POSIX;
my $PORT = 2100;
$|=1;
#get socket and make it reusuable,set it to raw sock
socket($SOCKET,AF_INET,SOCK_DGRAM,scalar getprotobyname('udp') ) || myerrno();
$my_addr=sockaddr_in($PORT,INADDR_ANY);
bind($SOCKET,$my_addr);
$SOCKET->blocking(0);
$SOCKET->autoflush(1);
print "server up ad ready for connections\n";
# start recieving the data
while(){
$remote_addr=recv($SOCKET,$buff,"1000",0) or die "problem with recv: $!";
$msg_recived++;
($R_port,$R_addr)=sockaddr_in($remote_addr);
$R_addr=inet_ntoa($R_addr);
print "\nrecived:\n $buff\n...from $R_addr:$R_port MSG number $msg_recived\n";
}
sub myerrno{
foreach $Val (keys( %!) ){
print "$Val $!{$Val}\n" if $!{$Val};
}
exit(1);
}
_____paste server_____
_____cut client_______
use POSIX qw ( :sys_wait_h :unistd_h);
use Socket qw(:DEFAULT :crlf);
use IO::Handle;
use Fcntl;
my $CHILD_SPAWNED=0;
my $CHILD_TO_CREATE=10;
my $MAX_CHILD=3;
my $PORT = 2100;
my $CHILD_CREATED=0;
$|=1;
while( $CHILD_SPAWNED < $CHILD_TO_CREATE ){
# lets get the socket readY
#get socket
socket($SOCKET_OUT,AF_INET,SOCK_DGRAM,scalar getprotobyname('udp') ) || myerrno();
# make it non-buffred non-block IO
$SOCKET_OUT->blocking(0);
$SOCKET_OUT->autoflush(1);
# pack the destination address with port
$f_addr=sockaddr_in($PORT,inet_aton("127.0.0.1") );
# set the destination address on socket
connect($SOCKET_OUT,$f_addr) || myerrno();
if( $CHILD_CREATED < $MAX_CHILD ){
die "couldnt not spawn: $!" unless defined ( my $PID=fork() );
$CHILD_CREATED++;
$CHILD_SPAWNED++;
unless( $PID ){
$status=dup2(fileno($SOCKET_OUT),fileno(STDOUT) );
print $SOCKET_OUT "hello from $$\n";
exit(0);
}
}
close $SOCKET_OUT;
$status=waitpid(-1,WNOHANG);
if( $status != 0 ){ #some child has exited
$CHILD_CREATED--;
print "child $status has exited \n";
}
}
syswrite(\*STDOUT, "TOTAL CHILD SPAWNED IS $CHILD_SPAWNED\n");
sub myerrno{
foreach $Val (keys( %!) ){
print "$Val $!{$Val}\n" if $!{$Val};
}
exit(1);
}
____paste client____