0

exec() を使用して AC シミュレーションを実行する php スクリプトをデバッグするのに何時間も費やしました。どこにでも stderr 印刷メッセージをスローした後、根本的な問題は、sprintf() を使用して小さすぎる char 配列へのディレクトリ パスを印刷することであることが最終的にわかりました。

セグメンテーション違反だったと思いますが、「セグメンテーション違反」というシェル エラー メッセージを実際に見たことはありません。割り当てサイズを変更すると、すべてが機能しました。

stderr 出力をログ ファイルにリダイレクトしていましたが、そのログ ファイルは fprintf(stderr,"..."); からすべてのメッセージを取得しました。シェルエラーメッセージは表示されませんでした。

コマンドはこれ

exec("$cmd 2>> $logFile & $PROCFILE 1 $ipaddr $! 2>> $logFile", $output, $rv);

$cmd は AC シミュレーションを実行し、$PROCFILE は 3 つの引数 (1、$ipaddr、および $!) を取る 2 番目の C プログラムを実行します。割り当てサイズの問題を修正する前は、php スクリプトは $cmd シミュレーションの実行を停止し、次の行 (つまり、exec() ステートメントの後) に進みました。php ファイルの次の行は、

if(rv!=0){handle error}

しかし、それも問題をキャッチしませんでした。

権限エラーが発生していると考え続けました。シェルエラーを表示するために exec() を取得するにはどうすればよいですか? それとも、'&' を使用して 2 つのプログラムを同時に実行した結果ですか?

4

1 に答える 1

0

プログラムが停止すると、「セグメンテーション違反」メッセージはプログラムからではなく、シェルから送信されます。リダイレクトは、シェルではなく、プログラムの出力にのみ適用されます。メッセージは $output 変数に入れる必要があります。$rv が 0 で、$output に何もない場合、何が起こったのか間違っているのではないかと思います。以下のような単純なテスト プログラムを作成して、これを確認することをお勧めします。

kill(0, SIGSEGV);

ところで、なぜ を使用しsnprintf()ないので、そもそもバッファ オーバーフローが発生しないのでしょうか。

于 2012-08-12T04:26:01.417 に答える