Perl’s system()
is not the system(3)
call [C-library]. This is
how the arguments to system()
get interpreted. When there is a single
argument to system(), it’ll be checked for for having shell
metacharacters first (like *
,?
), and if there are any–Perl
interpreter invokes a real shell program (/bin/sh -c on Unix
platforms). If you pass a list of arguments to system(), they will be
not checked for metacharacters, but split into words if required and
passed directly to the C-level execvp()
system call, which is more
efficient. That’s a very nice optimization. In other words, only
if you do:
system "sh -c 'echo *'"will the operating system actually
exec()
a copy of/bin/sh
to
parse your command. But even then since sh is almost certainly
already running somewhere, the system will notice that (via the disk
inode reference) and replace your virtual memory page table with one
pointing to the existing program code plus your data space, thus will
not create this overhead.References
-
The mod_perl site’s URL: http://perl.apache.org/
-
Apache-SubProcess
http://search.cpan.org/search?dist=Apache-SubProcess