better documentation for goto &NAME (from M. J. T. Guy)
[p5sagit/p5-mst-13.2.git] / pod / perlfaq8.pod
index e99cf42..f8dda0d 100644 (file)
@@ -1,6 +1,6 @@
 =head1 NAME
 
-perlfaq8 - System Interaction ($Revision: 1.25 $, $Date: 1998/07/05 15:07:20 $)
+perlfaq8 - System Interaction ($Revision: 1.39 $, $Date: 1999/05/23 18:37:57 $)
 
 =head1 DESCRIPTION
 
@@ -15,8 +15,9 @@ contain more detailed information on the vagaries of your perl.
 
 =head2 How do I find out which operating system I'm running under?
 
-The $^O variable ($OSNAME if you use English) contains the operating
-system that your perl binary was built for.
+The $^O variable ($OSNAME if you use English) contains an indication of
+the name of the operating system (not its release number) that your perl
+binary was built for.
 
 =head2 How come exec() doesn't return?
 
@@ -74,7 +75,7 @@ Or like this:
 =head2 How do I read just one key without waiting for a return key?
 
 Controlling input buffering is a remarkably system-dependent matter.
-If most systems, you can just use the B<stty> command as shown in
+On many systems, you can just use the B<stty> command as shown in
 L<perlfunc/getc>, but as you see, that's already getting you into
 portability snags.  
 
@@ -167,7 +168,7 @@ not to block:
 
 =head2 How do I clear the screen?
 
-If you only have to so infrequently, use C<system>:
+If you only have do so infrequently, use C<system>:
 
     system("clear");
 
@@ -325,7 +326,6 @@ go bump in the night, finally came up with this:
        }
     }
 
-
 =head2 How do I decode encrypted password files?
 
 You spend lots and lots of money on dedicated hardware, but this is
@@ -422,7 +422,7 @@ properly, the getpw*() functions described in L<perlfunc> should in
 theory provide (read-only) access to entries in the shadow password
 file.  To change the file, make a new shadow password file (the format
 varies from system to system - see L<passwd(5)> for specifics) and use
-pwd_mkdb(8) to install it (see L<pwd_mkdb(5)> for more details).
+pwd_mkdb(8) to install it (see L<pwd_mkdb(8)> for more details).
 
 =head2 How do I set the time and date?
 
@@ -452,9 +452,9 @@ http://www.perl.com/CPAN/doc/misc/ancient/tutorial/eg/itimers.pl .
 In general, you may not be able to.  The Time::HiRes module (available
 from CPAN) provides this functionality for some systems.
 
-In general, you may not be able to.  But if your system supports both the
-syscall() function in Perl as well as a system call like gettimeofday(2),
-then you may be able to do something like this:
+If your system supports both the syscall() function in Perl as well as
+a system call like gettimeofday(2), then you may be able to do
+something like this:
 
     require 'sys/syscall.ph';
 
@@ -462,7 +462,7 @@ then you may be able to do something like this:
 
     $done = $start = pack($TIMEVAL_T, ());
 
-    syscall( &SYS_gettimeofday, $start, 0)) != -1
+    syscall(&SYS_gettimeofday, $start, 0) != -1
                or die "gettimeofday: $!";
 
        ##########################
@@ -674,26 +674,33 @@ there, and the old standard error shows up on the old standard out.
 
 =head2 Why doesn't open() return an error when a pipe open fails?
 
-It does, but probably not how you expect it to.  On systems that
-follow the standard fork()/exec() paradigm (such as Unix), it works like
-this: open() causes a fork().  In the parent, open() returns with the
-process ID of the child.  The child exec()s the command to be piped
-to/from.  The parent can't know whether the exec() was successful or
-not - all it can return is whether the fork() succeeded or not.  To
-find out if the command succeeded, you have to catch SIGCHLD and
-wait() to get the exit status.  You should also catch SIGPIPE if
-you're writing to the child -- you may not have found out the exec()
+Because the pipe open takes place in two steps: first Perl calls
+fork() to start a new process, then this new process calls exec() to
+run the program you really wanted to open.  The first step reports
+success or failure to your process, so open() can only tell you
+whether the fork() succeeded or not.
+
+To find out if the exec() step succeeded, you have to catch SIGCHLD
+and wait() to get the exit status.  You should also catch SIGPIPE if
+you're writing to the child--you may not have found out the exec()
 failed by the time you write.  This is documented in L<perlipc>.
 
+In some cases, even this won't work.  If the second argument to a
+piped open() contains shell metacharacters, perl fork()s, then exec()s
+a shell to decode the metacharacters and eventually run the desired
+program.  Now when you call wait(), you only learn whether or not the
+I<shell> could be successfully started.  Best to avoid shell
+metacharacters.
+
 On systems that follow the spawn() paradigm, open() I<might> do what
-you expect - unless perl uses a shell to start your command. In this
+you expect--unless perl uses a shell to start your command. In this
 case the fork()/exec() description still applies.
 
 =head2 What's wrong with using backticks in a void context?
 
 Strictly speaking, nothing.  Stylistically speaking, it's not a good
 way to write maintainable code because backticks have a (potentially
-humungous) return value, and you're ignoring it.  It's may also not be very
+humongous) return value, and you're ignoring it.  It's may also not be very
 efficient, because you have to read in all the lines of output, allocate
 memory for them, and then throw it away.  Too often people are lulled
 to writing:
@@ -719,7 +726,7 @@ In most cases, this could and probably should be written as
     system("cat /etc/termcap") == 0
        or die "cat program failed!";
 
-Which will get the output quickly (as its generated, instead of only
+Which will get the output quickly (as it is generated, instead of only
 at the end) and also check the return value.
 
 system() also provides direct control over whether shell wildcard
@@ -745,8 +752,14 @@ You have to do this:
     }
 
 Just as with system(), no shell escapes happen when you exec() a list.
+Further examples of this can be found in L<perlipc/"Safe Pipe Opens">.
 
-There are more examples of this L<perlipc/"Safe Pipe Opens">.
+Note that if you're stuck on Microsoft, no solution to this vexing issue
+is even possible.  Even if Perl were to emulate fork(), you'd still
+be hosed, because Microsoft gives no argc/argv-style API.  Their API
+always reparses from a single string, which is fundamentally wrong,
+but you're not likely to get the Gods of Redmond to acknowledge this
+and fix it for you.
 
 =head2 Why can't my script read from STDIN after I gave it EOF (^D on Unix, ^Z on MS-DOS)?
 
@@ -869,7 +882,7 @@ module for other solutions.
 
 =item *
 
-Open /dev/tty and use the the TIOCNOTTY ioctl on it.  See L<tty(4)>
+Open /dev/tty and use the TIOCNOTTY ioctl on it.  See L<tty(4)>
 for details.  Or better yet, you can just use the POSIX::setsid()
 function, so you don't have to worry about process groups.
 
@@ -890,6 +903,9 @@ Background yourself like this:
 
 =back
 
+The Proc::Daemon module, available from CPAN, provides a function to
+perform these actions for you.
+
 =head2 How do I make my program run with sh and csh?
 
 See the F<eg/nih> script (part of the perl source distribution).
@@ -908,7 +924,7 @@ the current process group of your controlling terminal as follows:
 
     use POSIX qw/getpgrp tcgetpgrp/;
     open(TTY, "/dev/tty") or die $!;
-    $tpgrp = tcgetpgrp(TTY);
+    $tpgrp = tcgetpgrp(fileno(*TTY));
     $pgrp = getpgrp();
     if ($tpgrp == $pgrp) {
         print "foreground\n";
@@ -919,7 +935,7 @@ the current process group of your controlling terminal as follows:
 =head2 How do I timeout a slow event?
 
 Use the alarm() function, probably in conjunction with a signal
-handler, as documented L<perlipc/"Signals"> and chapter 6 of the
+handler, as documented in L<perlipc/"Signals"> and chapter 6 of the
 Camel.  You may instead use the more flexible Sys::AlarmCall module
 available from CPAN.
 
@@ -961,12 +977,15 @@ sysopen():
     sysopen(FH, "/tmp/somefile", O_WRONLY|O_NDELAY|O_CREAT, 0644)
         or die "can't open /tmp/somefile: $!":
 
-=head2 How do I install a CPAN module?
+   
+
+
+=head2 How do I install a module from CPAN?
 
-The easiest way is to have the CPAN module do it for you.  This module
-comes with perl version 5.004 and later.  To manually install the CPAN
-module, or any well-behaved CPAN module for that matter, follow these
-steps:
+The easiest way is to have a module also named CPAN do it for you.
+This module comes with perl version 5.004 and later.  To manually install
+the CPAN module, or any well-behaved CPAN module for that matter, follow
+these steps:
 
 =over 4
 
@@ -1005,7 +1024,7 @@ Perl offers several different ways to include code from one file into
 another.  Here are the deltas between the various inclusion constructs:
 
     1)  do $file is like eval `cat $file`, except the former:
-       1.1: searches @INC.
+       1.1: searches @INC and updates %INC.
        1.2: bequeaths an *unrelated* lexical scope on the eval'ed code.
 
     2)  require $file is like do $file, except the former:
@@ -1034,6 +1053,13 @@ scripts that use the modules/libraries (see L<perlrun>) or say
 
     use lib '/u/mydir/perl';
 
+This is almost the same as:
+
+    BEGIN {
+       unshift(@INC, '/u/mydir/perl');
+    }
+
+except that the lib module checks for machine-dependent subdirectories.
 See Perl's L<lib> for more information.
 
 =head2 How do I add the directory my program lives in to the module/library search path?
@@ -1048,7 +1074,7 @@ Here are the suggested ways of modifying your include path:
 
     the PERLLIB environment variable
     the PERL5LIB environment variable
-    the perl -Idir commpand line flag
+    the perl -Idir command line flag
     the use lib pragma, as in
         use lib "$ENV{HOME}/myown_perllib";
 
@@ -1056,9 +1082,15 @@ The latter is particularly useful because it knows about machine
 dependent architectures.  The lib.pm pragmatic module was first
 included with the 5.002 release of Perl.
 
+=head2 What is socket.ph and where do I get it?
+
+It's a perl4-style file defining values for system networking
+constants.  Sometimes it is built using h2ph when Perl is installed,
+but other times it is not.  Modern programs C<use Socket;> instead.
+
 =head1 AUTHOR AND COPYRIGHT
 
-Copyright (c) 1997, 1998 Tom Christiansen and Nathan Torkington.
+Copyright (c) 1997-1999 Tom Christiansen and Nathan Torkington.
 All rights reserved.
 
 When included as part of the Standard Version of Perl, or as part of