12

これは実行するコードです



    cp.exec("cc -Wall /tmp/test.c -o /tmp/test", function(e, stdout, stderr) {
        if (e) {
            var errorstr = "Compilation failed with the following error
"+ e.message.toString() client.send(errorstr) console.log(e, stdout, stderr) ee.prototype.removeAllListeners() } else if (stderr.length > 0) { client.send("Compilion finished with warnings\n"+ stderr + '\n') client.send('compiled') ee.prototype.emit('compiled') } else { client.send("Compilation successful") ee.prototype.emit('compiled') } })

「client」は、socket.io のコールバック引数の引数です。「ee」は EventEmitter のインスタンスです

問題に来ます。コードを実行すると、コールバックはコマンドが失敗したことを示します。console.log(e, stdout, stderr) は

{ [エラー: コマンドが失敗しました: ] 終了: false、コード: false、シグナル: 未定義 } '' ''

/tmp/test.c は有効な C コードであり、ディレクトリ /tmp を確認すると、test.c が適切であり、バイナリ 'test'生成され、シェルでの実行時に適切に実行されることがわかります。したがって、実行の失敗にフラグを立てる理由がわかりません。エラー オブジェクトの情報も役に立ちません。いくつかの助け/説明をいただければ幸いです

4

1 に答える 1

9

コンソールの出力が少し心配です。

{ [Error: Command failed: ] killed: false, code: false, signal: undefined }

適切な JSON/JavaScript オブジェクト、特にその[Error: Command failed: ]部分のようには見えません。少なくともカンマがありません。

提案:

  1. コマンド ラインからコマンドを実行し、終了コードを確認します ( を使用echo $?)。終了コードが != 0 の場合、これはコマンドが「失敗した」ことを意味します (意味が何であれ)。

  2. コマンドが失敗すると、nodejs は終了コードを配置すると言いますe.code(これは出力にありません...)。この値に何が起こったのかを調べます。

  3. if(e !== null)の代わりに試してくださいif(e)。しかし、違いを生むべきではありません。

  4. コンパイラを直接呼び出す代わりに、stderr/stdout をファイルにリダイレクトする (または を使用してコピーを保存するcc ... |& tee /tmp/cc.log) シェル スクリプトを呼び出して、複雑なセットアップのどの部分も重要な情報を飲み込まないようにします。

于 2013-01-14T14:07:36.620 に答える