2

qnx システムで mongoose 3.7 サーバーを実行しています。

ファームウェアをアップグレードするための http リクエストを受け取りました。要求に応じsystem()て、要求ハンドラーを呼び出してファームウェアをアップグレードします。

しかし、不思議なことに、system()255 を返します。同じ呼び出しは、以前は mongoose 2.0 で機能していました。

さらに奇妙なことに、system()呼び出しで発行したコマンドは、255 が返された後に機能します。

返さWEXITSTATUSれるエラーを知るために使用していますsystem()

なぜこれが起こっているのですか?

4

1 に答える 1

3

私は問題を見つけました..

問題は、system() コマンドを発行する mongoose コールバック スレッドが、次の行があるため、戻りステータスを待機しないことでした。

サーバースレッドを開始する mg_start() 関数には、次の行が含まれています。

mg_start()行番号 5159:

(void) signal(SIGCHLD, SIG_IGN);

これは、ゾンビ プロセスを作成しないようにするためです。

参照: http://www.win.tue.nl/~aeb/linux/lk/lk-5.html

しかし、QN​​Xのドキュメントによると、

「保留中のシグナルに対してシグナル アクションを に設定するSIG_IGNと、ブロックされているかどうかに関係なく、保留中のシグナルが破棄されます。SIGCHLDプロセスがシグナル のアクションを に設定した場合SIG_IGN、動作は未規定です。」</p>

SIG_IGNonを呼び出すSIGCHLDと、親プロセスは子プロセスからのステータス シグナルを無視します。

呼び出しを行うsystem()と、起動中のシェルからの SIGCHLD シグナルがブロックされます。UNIXのドキュメントによると:

SIGCHLD「子が終了するのを待っている間にブロックすると、アプリケーションがシグナルをキャッチして、system() の子プロセスからステータスを取得してからsystem()、ステータス自体を取得できなくなります。」</p>

しかし、マングースはシグナルを破棄するため、からのシグナルをまったく待ちませんsystem()

からの有効な戻りステータスなしで、応答を提供し続けるだけですsystem()

とりあえず、この行をコメントアウトしました。そしてそれは働いています。

于 2013-08-21T12:08:50.223 に答える