Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl Monk, Perl Meditation
 
PerlMonks  

Re: RFC: Shell::DWIM

by Zaxo (Archbishop)
on Oct 07, 2002 at 16:52 UTC ( [id://203395]=note: print w/replies, xml ) Need Help??


in reply to RFC: Shell::DWIM

The system function is inherently platform specific. Its arguments must be in a form the OS can digest, and available system calls vary widely between platforms. It seems to me that system as it is reminds us to think twice before calling it.

On *nix, the value returned by system doesn't necessarily reflect an OS error. It may contain an application-specific exit code. In perl, you can write exit -5; to indicate, say, that command line arguments are not to your liking, and provide other exit codes to help diagnose other runtime problems.

When perl system or a command line process returns, the process run is done and its environment has evaporated. Its $! (errno) is gone. All that is left is what can be recovered by wait. The child error $? encodes the low eight bits of the of the exit code, a signal number and a flag indicating a core dump.

What distinct information is available on exit from a VMS, Win32 or OS/2 system call? How much different are the extended error returns?

After Compline,
Zaxo

Replies are listed 'Best First'.
Re: Re: RFC: Shell::DWIM
by erikharrison (Deacon) on Oct 07, 2002 at 17:21 UTC

    On *nix, the value returned by system doesn't necessarily reflect an OS error

    Which is a common newbie error. They check the value of $! inappropriately after system. According to perlvar, $! (or $^E on some systems) will have useful information after system or backticks if (and only if) $? == -1. Hence the check.

    What distinct information is available on exit from a VMS, Win32 or OS/2 system call? How much different are the extended error returns?

    system returns the same. However, system may fail with $? = -1 when the child process fails due to an OS error. $! is C's errno, but on VMS, Win32, and OS/2 the underlying API provides it's own error messages which C's errno does not reflect. On these systems $^E holds that value (see perlvar for the specific API calls made to get that value). This is a workaround for the fact that Perl and C are still a bit *nix centric. $^E exists for people who aren't on *nix systems while still allowing *nix programmers on Windows or the like still get what they expect from $!.

    Cheers,
    Erik

    Light a man a fire, he's warm for a day. Catch a man on fire, and he's warm for the rest of his life. - Terry Pratchet

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://203395]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others making s'mores by the fire in the courtyard of the Monastery: (5)
As of 2024-04-19 03:58 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found