ホームページ >バックエンド開発 >PHPチュートリアル >Linux_PHPチュートリアルでPHPのexecの戻り値が負の値にならない問題

Linux_PHPチュートリアルでPHPのexecの戻り値が負の値にならない問題

WBOY
WBOYオリジナル
2016-07-13 10:56:18978ブラウズ

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

このようにして、exec が OS に返す値を確認できます。
Linux では、この戻り値は符号なし型で正の数値を返すため、PHP に渡されるときも、実際には exec 呼び出しによって返される値になります。

ディレクトリ操作の実行


子プロセスの実行方法をより詳細に制御するには、proc_open() 関数を使用できます:

2 反対票

子プロセスの実行方法をより詳細に制御するには、proc_open() 関数を使用できます。

-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$

コードは次のとおりですコードをコピー
$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.comtru​​e

http://www.bkjia.com/PHPjc/632187.html技術記事 Windows環境ではexec関数は問題ありませんが、Linuxでは戻り値が負になることはありません。 string exec ( string $command [, array $output [, int $return_var ]] ) 3 番目のパラメータ...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。