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) 是

{ [错误:命令失败:] 杀死:假,代码:假,信号:未定义}''''

/tmp/test.c 是有效的 C 代码,在检查目录 /tmp 时,我发现 test.c 是正确的,并且正在生成二进制“测试”在 shell 中运行时正确执行。所以我不明白为什么它会标记执行不成功。错误对象的信息也无济于事。将不胜感激一些帮助/解释

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)的 shell 脚本,以确保复杂设置的任何部分都不会吞下重要信息。

于 2013-01-14T14:07:36.620 回答