summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCraig A. Berry <craigberry@mac.com>2002-06-25 16:46:59 -0500
committerRafael Garcia-Suarez <rgarciasuarez@gmail.com>2002-06-26 14:38:10 +0000
commit41cbbefae8dc68445cf3cea5b9db7b7f4a1385db (patch)
treeafa62d3b4c44d83f0e510ba6a6a519f07bbe073f
parent8514a05ad77d06390899752b405c952ef7bae9d5 (diff)
downloadperl-41cbbefae8dc68445cf3cea5b9db7b7f4a1385db.tar.gz
VMS nits, add getppid(), admit absence of fork()
From: "Craig A. Berry" <craigberry@mac.com> Message-ID: <a05111b00b93ec39cdf8f@[172.16.52.1]> p4raw-id: //depot/perl@17359
-rw-r--r--configure.com35
-rw-r--r--pod/perlport.pod4
-rw-r--r--vms/perlvms.pod67
3 files changed, 54 insertions, 52 deletions
diff --git a/configure.com b/configure.com
index a4bfbf2c2a..085596d66b 100644
--- a/configure.com
+++ b/configure.com
@@ -1540,12 +1540,12 @@ $ WRITE CONFIG " exit(0);"
$ WRITE CONFIG "}"
$ CLOSE CONFIG
$!
-$! DEFINE SYS$ERROR _NLA0:
-$! DEFINE SYS$OUTPUT _NLA0:
+$ SET NOON
+$ DEFINE/USER_MODE SYS$ERROR _NLA0:
+$ DEFINE/USER_MODE SYS$OUTPUT _NLA0:
$ cc/NoObj/list=ccvms.lis ccvms.c
$ tmp = $status
-$! DEASSIGN SYS$OUTPUT
-$! DEASSIGN SYS$ERROR
+$ SET ON
$ IF (silent) THEN GOSUB Shut_up
$ IF tmp.NE.%X10B90001
$ THEN
@@ -1565,9 +1565,9 @@ $ IF .NOT.silent
$ THEN
$ echo "Will try cc/decc..."
$ ENDIF
+$ SET NOON
$ DEFINE/USER_MODE SYS$ERROR NL:
$ DEFINE/USER_MODE SYS$OUTPUT NL:
-$ SET NOON
$ cc/decc/NoObj/list=ccvms.lis ccvms.c
$ tmp = $status
$ SET ON
@@ -1591,10 +1591,12 @@ $!
$Gcc_initial_check:
$ echo "Checking for gcc"
$ OPEN/WRITE CONFIG gccvers.lis
+$ SET NOON
$ DEFINE/USER_MODE SYS$ERROR CONFIG
$ DEFINE/USER_MODE SYS$OUTPUT CONFIG
$ 'gcc_symbol'/noobj/version _nla0:
$ tmp = $status
+$ SET ON
$ IF (silent) THEN GOSUB Shut_up
$ CLOSE CONFIG
$ IF (tmp.NE.%X10000001).and.(tmp.ne.%X00030001)
@@ -2337,7 +2339,7 @@ $ echo ""
$ bool_dflt = "y"
$ if f$type(useithreads) .nes. ""
$ then
-$ if .not. useithreads .or. useithreads .eqs. "undef" then bool_dflt="n"
+$ if useithreads .eqs. "undef" then bool_dflt="n"
$ endif
$ if f$type(use5005threads) .nes. ""
$ then
@@ -3374,6 +3376,25 @@ $ tmp = "unistd.h"
$ GOSUB inhdr
$ i_unistd = tmp
$!
+$! do we have getppid()?
+$!
+$ IF i_unistd .EQS. "define"
+$ THEN
+$ OS
+$ WS "#include <stdio.h>"
+$ WS "#include <unistd.h>"
+$ WS "int main() {"
+$ WS "printf(""%d\n"",getppid());"
+$ WS "return(0);"
+$ WS "}"
+$ CS
+$ tmp = "getppid"
+$ GOSUB inlibc
+$ d_getppid = tmp
+$ ELSE
+$ d_getppid = "undef"
+$ ENDIF
+$!
$!: see if this is a libutil.h system
$!
$ tmp = "libutil.h"
@@ -5253,7 +5274,7 @@ $ WC "d_getpent='" + d_getpent + "'"
$ WC "d_getpgid='undef'"
$ WC "d_getpgrp2='undef'"
$ WC "d_getpgrp='undef'"
-$ WC "d_getppid='undef'"
+$ WC "d_getppid='" + d_getppid + "'"
$ WC "d_getprior='undef'"
$ WC "d_getprotoprotos='" + d_getprotoprotos + "'"
$ WC "d_getprpwnam='undef'"
diff --git a/pod/perlport.pod b/pod/perlport.pod
index 44c79de6f8..8fb3561981 100644
--- a/pod/perlport.pod
+++ b/pod/perlport.pod
@@ -1567,7 +1567,7 @@ Available only on Windows NT (not on Windows 95). (Win32)
=item fork
-Not implemented. (S<Mac OS>, AmigaOS, S<RISC OS>, VOS, VM/ESA)
+Not implemented. (S<Mac OS>, AmigaOS, S<RISC OS>, VOS, VM/ESA, VMS)
Emulated using multiple interpreters. See L<perlfork>. (Win32)
@@ -1584,7 +1584,7 @@ Not implemented. (S<Mac OS>, Win32, VMS, S<RISC OS>, VOS)
=item getppid
-Not implemented. (S<Mac OS>, Win32, VMS, S<RISC OS>)
+Not implemented. (S<Mac OS>, Win32, S<RISC OS>)
=item getpriority WHICH,WHO
diff --git a/vms/perlvms.pod b/vms/perlvms.pod
index 5ba34bb076..35c3d840ab 100644
--- a/vms/perlvms.pod
+++ b/vms/perlvms.pod
@@ -338,7 +338,7 @@ Perl functions were implemented in the VMS port of Perl
caller, chdir, chmod, chown, chomp, chop, chr,
close, closedir, cos, crypt*, defined, delete,
die, do, dump*, each, endpwent, eof, eval, exec*,
- exists, exit, exp, fileno, fork*, getc, getlogin,
+ exists, exit, exp, fileno, getc, getlogin, getppid,
getpwent*, getpwnam*, getpwuid*, glob, gmtime*, goto,
grep, hex, import, index, int, join, keys, kill*,
last, lc, lcfirst, length, local, localtime, log, m//,
@@ -358,8 +358,8 @@ The following functions were not implemented in the VMS port,
and calling them produces a fatal error (usually) or
undefined behavior (rarely, we hope):
- chroot, dbmclose, dbmopen, flock,
- getpgrp, getppid, getpriority, getgrent, getgrgid,
+ chroot, dbmclose, dbmopen, flock, fork*,
+ getpgrp, getpriority, getgrent, getgrgid,
getgrnam, setgrent, endgrent, ioctl, link, lstat,
msgctl, msgget, msgsend, msgrcv, readlink, semctl,
semget, semop, setpgrp, setpriority, shmctl, shmget,
@@ -482,49 +482,30 @@ affected by calling C<dump>.
=item exec LIST
-The C<exec> operator behaves in one of two different ways.
-If called after a call to C<fork>, it will invoke the CRTL
-C<execv()> routine, passing its arguments to the subprocess
-created by C<fork> for execution. In this case, it is
-subject to all limitations that affect C<execv()>. (In
-particular, this usually means that the command executed in
-the subprocess must be an image compiled from C source code,
-and that your options for passing file descriptors and signal
-handlers to the subprocess are limited.)
-
-If the call to C<exec> does not follow a call to C<fork>, it
-will cause Perl to exit, and to invoke the command given as
-an argument to C<exec> via C<lib$do_command>. If the argument
-begins with '@' or '$' (other than as part of a filespec), then it
-is executed as a DCL command. Otherwise, the first token on
-the command line is treated as the filespec of an image to
-run, and an attempt is made to invoke it (using F<.Exe> and
-the process defaults to expand the filespec) and pass the
-rest of C<exec>'s argument to it as parameters. If the token
-has no file type, and matches a file with null type, then an
-attempt is made to determine whether the file is an executable
-image which should be invoked using C<MCR> or a text file which
-should be passed to DCL as a command procedure.
-
-You can use C<exec> in both ways within the same script, as
-long as you call C<fork> and C<exec> in pairs. Perl
-keeps track of how many times C<fork> and C<exec> have been
-called, and will call the CRTL C<execv()> routine if there have
-previously been more calls to C<fork> than to C<exec>.
+A call to C<exec> will cause Perl to exit, and to invoke the command
+given as an argument to C<exec> via C<lib$do_command>. If the
+argument begins with '@' or '$' (other than as part of a filespec),
+then it is executed as a DCL command. Otherwise, the first token on
+the command line is treated as the filespec of an image to run, and
+an attempt is made to invoke it (using F<.Exe> and the process
+defaults to expand the filespec) and pass the rest of C<exec>'s
+argument to it as parameters. If the token has no file type, and
+matches a file with null type, then an attempt is made to determine
+whether the file is an executable image which should be invoked
+using C<MCR> or a text file which should be passed to DCL as a
+command procedure.
=item fork
-The C<fork> operator works in the same way as the CRTL
-C<vfork()> routine, which is quite different under VMS than
-under Unix. Specifically, while C<fork> returns 0 after it
-is called and the subprocess PID after C<exec> is called, in
-both cases the thread of execution is within the parent
-process, so there is no opportunity to perform operations in
-the subprocess before calling C<exec>.
-
-In general, the use of C<fork> and C<exec> to create
-subprocesses is not recommended under VMS; wherever possible,
-use the C<system> operator or piped filehandles instead.
+While in principle the C<fork> operator could be implemented via
+(and with the same rather severe limitations as) the CRTL C<vfork()>
+routine, and while some internal support to do just that is in
+place, the implementation has never been completed, making C<fork>
+currently unavailable. A true kernel C<fork()> is expected in a
+future version of VMS, and the pseudo-fork based on interpreter
+threads may be available in a future version of Perl on VMS (see
+L<perlfork>). In the meantime, use C<system>, backticks, or piped
+filehandles to create subprocesses.
=item getpwent