Php exec cannot return negative values in linux. The exec function is normal in windows, but the return value cannot be negative in linux. Stringexec (string $ command [, array $ output [, int $ return_var]) The third exec function has no problem in windows, however, in linux, the return value cannot be negative.
String exec (string $ command [, array & $ output [, int & $ return_var])
In the third parameter, how can I not receive negative numbers ??
Here & $ return_var is the return value of the program. at first, my answer is a negative number.
We usually write this in c.
| The code is as follows: |
|
|
# Include
# Include
Int main ()
{
Printf ("^_^ n ");
Return-5;
} |
This-5 is the return value, but it is written as 0 or 1.
Note: Many people write the main function as void main () in C code. this is actually not correct, so I won't go into details.
Compile the above code and run it in CMD. then the output result is displayed. Enter "echo % ERRORLEVEL %" and press enter to view the program return value. This % ERRORLEVEL % indicates the return status of the program. It can be a negative number in WIN. :
, Php call is also normal.
| The code is as follows: |
|
E: devphp535> php-r "exec('return.exe ', $ out, $ a); var_dump ($ );"
Int (-2)
|
However, in linux, it is always a positive number. it was initially suspected that it was a Permission problem. after chmod + x was used, the permission problem was ruled out.
| The code is as follows: |
|
Exec ("/home/wwwroot/test/rtest. out 2> & 1", $ out, $ );
Var_dump ($ out, $ );
Array (1) {[0] => string (3) "'''} int (251)
|
It seems to be 256 + return val. we can see that a negative number is actually returned, but it is converted to a positive number.
Then I read the source code in standard/exec. c, but I didn't find any clues. it was very strange. I suddenly thought I forgot a step. I forgot to read the OS value returned by the program.
Echo $? Displays the launch status of the last command.
| The code is as follows: |
|
-Bash-3.00 $ vi main. c
-Bash-3.00 $ gcc-o./mm main. c
-Bash-3.00 $ ll
Total 48
Drwxr-xr-x 3 www 4096 May 4 2011 2011
Drwxr-xr-x 6 www 4096 Jun 23 2011 eoc
-Rwxr-xr-x 1 www 7131 Feb 1 hello
-Rw-r -- 1 www 3 Feb 1 :51 hello. c
-Rw-r -- 1 www 99 Feb 1 :50 main. c
-Rwxr-xr-x 1 www 4714 Feb 1mm
Drwxr-xr-x 3 www 4096 Jun 24 2011 test
-Bash-3.00 $./mm
Pai_^
-Bash-3.00 $ echo $?
251
-Bash-3.00 $
|
In this way, you can see the value of exec returned to OS.
In linux, the returned value is of the unsigned type and returns a positive value. Therefore, it is also a positive value to pass to php. php is actually the value returned by the called exec.
Exec directory operations
2 down vote For greater control over how the child process will be executed, you can use the proc_open () function:
2 down vote
For greater control over how the child process will be executed, you can use the proc_open () function:
| The code is as follows: |
|
|
$ Cmd = 'Scripts/script. sh ';
$ Cwd = 'scripts ';
$ Spec = array (
// Can something more portable be passed here instead of/dev/null?
0 => array ('file', '/dev/Null', 'r '),
1 => array ('file', '/dev/Null', 'w '),
2 => array ('file', '/dev/Null', 'w '),
);
$ Ph = proc_open ($ cmd, $ spec, $ pipes, $ cwd );
If ($ ph = FALSE ){
// Open error
}
// If we are not passing/dev/null like above, we shoshould close
// Our ends of any pipes to signal that we're re done. Otherwise
// The call to proc_close below may block indefinitely.
Foreach ($ pipes as $ pipe ){
@ Fclose ($ pipe );
}
// Will wait for the process to terminate
$ Exit_code = proc_close ($ ph );
If ($ exit_code! = 0 ){
// Child error
} |
Bytes. String exec (string $ command [, array $ output [, int $ return_var]) third parameter...