jkahrman has asked for the wisdom of the Perl Monks concerning the following question:

My reading of 'perldoc -f system', 'perldoc -f exec', 'perldoc perlport' (system, exec, and wait sections), and 'perldoc perlvar' ($? section) lead me to expect a '-1' error code from system when the program to launch is not found (fails to launch).

The following returns -1 on Unix,

DB<5> x (system 'jxdDoesNotExist'), $?, $! Can't exec "jxdDoesNotExist": No such file or directory at 0 '-1' 1 '-1' 2 'No such file or directory'
As does this:
DB<7> x (system {'jxdDoesNotExist'} 'jxdDoesNotExist'), $?, $! Can't exec "jxdDoesNotExist": No such file or directory at 0 '-1' 1 '-1' 2 'No such file or directory'
But on Windows...
DB<3> x (system {'jxdDoesNotExist'} 'jxdDoesNotExist'), $?, $!, $^E 0 65280 1 65280 2 'No such file or directory' 3 'The system cannot find the file specified' DB<4> x (system 'jxdDoesNotExist'), $?, $!, $^E 'jxdDoesNotExist' is not recognized as an internal or external command +, operable program or batch file. 0 256 1 256 2 'No such file or directory' 3 'Access is denied'
The second Windows 'system' call makes some sense (the error code is from cmd.exe), based on the following snippet from 'perldoc -f system':
            ... On Windows, only the "system PROGRAM
            LIST" syntax will reliably avoid using the shell; "system LIST",
            even with more than one element, will fall back to the shell if
            the first spawn fails.
and from 'perlport'
    exec    "exec LIST" without the use of indirect object syntax ("exec
            PROGRAM LIST") may fall back to trying the shell if the first
            spawn() fails. (Win32)
combined with this snippet from 'perldoc -f system':
            Like "exec", "system" allows you to lie to a program about its
            name if you use the "system PROGRAM LIST" syntax. Again, see
            "exec".
But the 65280 code from the Windows "system PROGRAM LIST" syntax perplexes me. If perl knows the command failed to launch, shouldn't system return '-1' (as documented!!!) ?

See also rt://46333 and rt://95308, which led me to this question

Replies are listed 'Best First'.
Re: Why doesn't 'system' return '-1' when a program fails to start on Windows?
by huck (Prior) on Feb 24, 2017 at 01:58 UTC

    http://perldoc.perl.org/perlvar.html

    $CHILD_ERROR
    $?
    
    The status returned by the last pipe close, backtick (`` ) 
    command, successful call to wait() or waitpid(), or from the 
    system() operator. This is just the 16-bit status word 
    returned by the traditional Unix wait() system call (or else 
    is made up to look like it). Thus, the exit value of the 
    subprocess is really ($?>> 8 ), and $? & 127 gives which 
    signal, if any, the process died from, and $? & 128 reports 
    whether there was a core dump.
    
    #!perl -w use strict;use warnings; my $rc=system 'jxdDoesNotExist'; print 'rc:'.$rc."\n"; ec($?); print '$?:'.$?."\n"; print '$!:'.$!."\n"; print '$^E:'.$^E."\n"; print "\n\ntry2\n"; my $rc2=system {'jxdDoesNotExist'} 'jxdDoesNotExist'; print 'rc:'.$rc2."\n"; ec($?); print '$?:'.$?."\n"; print '$!:'.$!."\n"; print '$^E:'.$^E."\n"; sub ec { my $x=shift; print '>>8 :'.($x>>8)."\n"; print '&127:'.($x & 127)."\n"; print '&128:'.($x & 128)."\n"; }
    result:
    'jxdDoesNotExist' is not recognized as an internal or external command +, operable program or batch file. rc:256 >>8 :1 &127:0 &128:0 $?:256 $!:No such file or directory $^E: try2 Can't spawn "cmd.exe": No such file or directory at rc.pl line 12. rc:65280 >>8 :255 &127:0 &128:0 $?:65280 $!:No such file or directory $^E:The system cannot find the file specified
    so what is 255?
    Net helpmsg 255
    result
    The extended attributes are inconsistent.
    https://www.kapilarya.com/fix-the-extended-attributes-are-inconsistent-error-in-windows-10 FIX 2 – Via Windows Default Sound Scheme This might sound quite strange but from past experiences, users have found that if your sound scheme is not set to default, this issue may occur. Also if you’re using any third-party tool related to sound, uninstall it and make sure you’ve set Windows sound scheme to default one: Thats a strange one....

      http://perldoc.perl.org/perlport.html#system Failure to spawn() a subprocess is indicated by setting $? to "255 << 8" i think that is where 65280 is coming from, but i still like "fix 2", that wasnt the only place i found that fix proposed.

        http://perldoc.perl.org/perlport.html#system Failure to spawn() a subprocess is indicated by setting $? to "255 << 8"

        I definitely missed that. Seems like an odd choice for a sentinel value, though. I'm surprised '-1' wasn't used for consistency.

Re: Why doesn't 'system' return '-1' when a program fails to start on Windows?
by Anonymous Monk on Feb 24, 2017 at 01:52 UTC

    Because its not supposed to?

    Those bits of documentation aren't a description of what is supposed to happen, esp on every platform

    Only 0 on no-error is portable