Windows環境ではexec関数は問題ありませんが、Linuxでは戻り値が負になることはありません。
string exec ( string $command [, array &$output [, int &$return_var ]] )
3 番目のパラメータ、なぜ負の数値を受け入れられないのですか??
ここでの &$return_var はプログラムの戻り値です。最初の私の答えは、負の数を指定できるというものでした。
一般的にC言語では次のように書きます
コードは次のとおりです
| コードをコピー
|
#include
#include
int main()
{
Printf("^_^n");
-5 を返します;
}
|
この-5は戻り値ですが、0か1で書くのが慣例です。
注: 多くの人は C コードで main 関数を void main() として記述しますが、これは実際には間違っているため、詳細は説明しません。
上記のコードをコンパイルした後、CMD で実行すると、出力結果を確認できます。次に、「echo %ERRORLEVEL%」と入力して Enter キーを押すと、プログラムの戻り値が表示されます。この %ERRORLEVEL% は、プログラムの戻りステータスを表します。確かに、WIN では負の数になる可能性があります。写真に示すように:
、PHP 呼び出しも正常です。
コードは次のとおりです
| コードをコピー
|
E:devphp535>php -r "exec('return.exe',$out,$a);var_dump($a);"
int(-2)
|
しかし、Linux では、この数字は常にプラスになります。最初は、権限の問題ではないかと思いましたが、chmod +x を使用した後、権限の問題は解決されました。
コードは次のとおりです
| コードをコピー
|
exec("/home/wwwroot/test/rtest.out 2>&1",$out,$a);
var_dump($out,$a);
配列(1) { [0]=> 文字列(3) "^_^" } int(251)
|
256+return val のようになります。実際には負の数が返されますが、正の数に変換されていることがわかります。
次に、standard/exec.c のソース コードを調べましたが、何の手がかりも見つかりませんでした。そして、あるステップを忘れていたことに突然気づきました。プログラムがOSに返す値を見るのを忘れていました
echo $? を使用すると、最後のコマンドのステータスを表示できます。
コードは次のとおりです
| コードをコピー
|
-bash-3.00$ vi main.c
-bash-3.00$ gcc -o ./mm main.c
-bash-3.00$ll
合計48
drwxr-xr-x 3 www www 4096 2011 年 5 月 4 日 2011
drwxr-xr-x 6 www www 4096 2011 年 6 月 23 日 eoc
-rwxr-xr-x 1 www www 7131 2月1日 12:47 こんにちは
-rw-r--r-- 1 www www 3 2月1日 12:51 hello.c
-rw-r--r-- 1 www www 99 2月1日 12:50 main.c
-rwxr-xr-x 1 www www 4714 2 月 1 日 12:51 mm
drwxr-xr-x 3 www www 4096 2011 年 6 月 24 日のテスト
-bash-3.00$ ./mm
^_^
-bash-3.00$ エコー $?
251
-バッシュ-3.00$
|
このようにして、exec が OS に返す値を確認できます。
Linux では、この戻り値は符号なし型で正の数値を返すため、PHP に渡されるときも、実際には exec 呼び出しによって返される値になります。
ディレクトリ操作の実行
子プロセスの実行方法をより詳細に制御するには、proc_open() 関数を使用できます:
2 反対票
子プロセスの実行方法をより詳細に制御するには、proc_open() 関数を使用できます。
コードは次のとおりです
| コードをコピー
|
$cmd = 'スクリプト/script.sh';
$cwd = 'スクリプト';
$spec = 配列(
// /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) {
// オープンエラー
}
// 上記のように /dev/null を渡さない場合は、閉じる必要があります
// それ以外の場合は、パイプの終端で完了を通知します
// 以下の proc_close の呼び出しは無期限にブロックされる可能性があります
foreach ($pipes として $pipe) {
@fclose($pipe);
}
// プロセスが終了するまで待機します
$exit_code = proc_close($ph);
if ($exit_code !== 0) {
// 子エラー
}
|
http://www.bkjia.com/PHPjc/632187.htmlwww.bkjia.com
true
http://www.bkjia.com/PHPjc/632187.html技術記事 Windows環境ではexec関数は問題ありませんが、Linuxでは戻り値が負になることはありません。 string exec ( string $command [, array $output [, int $return_var ]] ) 3 番目のパラメータ...