4

cgi から system() を呼び出すと、常に -1 (エラーを意味する) が返されます。errno は 10、ECHILD に設定されます。

以下を含む test.cgi:

cout << "/bin/true " << system("/bin/true") << endl;
cout << "/bin/false " << system("/bin/false") << endl;
cout << "/bin/touch /tmp/foo" << system("/bin/touch /tmp/foo") << endl;

./test.cgi が返すように、コマンド ラインから呼び出されます。

/bin/true 0
/bin/false 256
/bin/touch /tmp/foo 0

ただし、これを Web ブラウザーからのリンクとして呼び出すと、(予想される不正な形式のヘッダー エラー メッセージの後) が返されます。

/bin/true -1
/bin/false -1
/bin/touch /tmp/foo -1

どちらの場合もコマンドが実行されることを確認しましたが (ファイル /tmp/foo が作成されます)、httpd (mongoose、ARM9、Linux) を介してコマンドを呼び出すと -1 が返されます。

ヒント、修正方法はありますか?

4

1 に答える 1

1

エラーsystemが原因で通話が失敗していECHILDます。これは、waitが待機しているときに発生しますが、保留中の子はありません。これの考えられる原因は、コード(または呼び出したコード)がのシグナルハンドラーをに設定しているSIGCHLDことSIG_IGNです。これをテストするには、SIGCHLDシグナルハンドラーをに設定SIG_DFLして、を呼び出す直前にデフォルトのシグナルハンドラーに復元しますsystem

先を行き過ぎたくないので、上記のテストがうまくいくかどうかを確認してください。もしそうなら、あなたのプログラムがシングルスレッドであるなら、あなたはテストを修正として使うことを考えることができます、そしてあなたはsystem完了後にそれが設定されたものにシグナルハンドラーを復元します。しかし、実際の修正は、シグナルハンドラーが設定された場所と理由を見つけて、それに対して何をしたいかを判断することです。

于 2012-06-19T07:58:04.427 に答える