#!/usr/bin/perl use Socket; use FileHandle; socket(SOCK, PF_INET, SOCK_STREAM, getprotobyname("tcp")) or die "socket: $!"; setsockopt(SOCK, SOL_SOCKET, SO_REUSEADDR, pack("l", 1)) or warn "setsockopt: $!"; bind(SOCK, sockaddr_in(8080, inet_aton("localhost"))) or die "bind: $!"; listen(SOCK, SOMAXCONN) or die "listen: $!"; while ( accept(my $sock = FileHandle->new(), SOCK) ) { printf STDERR "before aliasing: sock=%d, STDIN=%d, STDOUT=%d\n", fileno($sock), fileno(STDIN), fileno(STDOUT); *STDIN = $sock; *STDOUT = $sock; printf STDERR "after aliasing: sock=%d, STDIN=%d, STDOUT=%d\n", fileno($sock), fileno(STDIN), fileno(STDOUT); $| = 1; print "enter something:\n"; my $r = ; print "you typed: $r"; close $sock; } #### $ perl ./aliasing1.pl before aliasing: sock=5, STDIN=0, STDOUT=1 after aliasing: sock=5, STDIN=5, STDOUT=5 ^C $ #### $ telnet localhost 8080 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. enter something: foo you typed: foo Connection closed by foreign host. #### $ perl -d ./aliasing1.pl Loading DB routines from perl5db.pl version 1.28 Editor support available. Enter h or `h h' for help, or `man perldebug' for more help. main::(./aliasing1.pl:5): socket(SOCK, PF_INET, SOCK_STREAM, getprotobyname("tcp")) or die "socket: $!"; DB<1> c before aliasing: sock=9, STDIN=0, STDOUT=1 after aliasing: sock=9, STDIN=0, STDOUT=1 enter something: foo you typed: foo ^C IO::Handle::DESTROY(/usr/local/perl-5.8.8/lib/5.8.8/i686-linux/IO/Handle.pm:328): 328: sub DESTROY {} DB<1> q $ #### POSIX::dup2(fileno($sock), 0) or die "Cannot dup sock to STDIN: $!"; POSIX::dup2(fileno($sock), 1) or die "Cannot dup sock to STDOUT: $!"; #### open STDIN, "<&", $sock or die "Cannot dup sock to STDIN: $!"; open STDOUT, ">&", $sock or die "Cannot dup sock to STDOUT: $!"; #### #!/usr/bin/perl my $file = "foo.out"; open my $fh, ">", $file or die "cannot open $file: $!"; printf STDERR "fds before aliasing: fh=%d, STDOUT=%d\n", fileno($fh), fileno(STDOUT); *STDOUT = $fh; printf STDERR "fds after aliasing: fh=%d, STDOUT=%d\n", fileno($fh), fileno(STDOUT); print "foo\n"; #### $ perl ./aliasing2.pl fds before aliasing: fh=3, STDOUT=1 fds after aliasing: fh=3, STDOUT=3 #### $ perl -d ./aliasing2.pl Loading DB routines from perl5db.pl version 1.28 Editor support available. Enter h or `h h' for help, or `man perldebug' for more help. main::(./aliasing2.pl:3): my $file = "foo.out"; DB<1> c fds before aliasing: fh=8, STDOUT=1 fds after aliasing: fh=8, STDOUT=8 Debugged program terminated. Use q to quit or R to restart, use o inhibit_exit to avoid stopping after program termination, h q, h R or h o to get additional info. DB<1> q