process.exit(0):输出消失了吗?

时间:2013-09-11 18:00:30

标签: windows node.js emacs elisp

Emacs lisp命令调用node hello.js

(call-process "node" nil t nil "hello.js")

hello.js的两个变体:

  • hello_1.js

    console.log('Hello world!');
    

    输出:

    Hello world!
    0
    
  • hello_2.js

    console.log('Hello world!');
    process.exit(5);
    

    输出(没有来自log语句的输出!):

    5
    

process.exit(5)导致输出被抑制的原因是什么?

注意:

  • 我在 GNU Emacs 24.3.1(i386-mingw-nt5.1.2600)中遇到了问题 2013-03-17关于MARVIN Node.js v0.10.18 的组合,运行于 Windows XP / SP3 / 32

  • 我尝试EShell执行节点命令行:无输出

  • process.exit()调用低级process.reallyExit(),这会导致问题: 没有输出

    process.reallyExit()在C ++中实现:

    void Exit(const FunctionCallbackInfo<Value>& args) {
      HandleScope scope(node_isolate);
      exit(args[0]->IntegerValue());
    }
    

    [...]

    NODE_SET_METHOD(process, "reallyExit", Exit);
    

1 个答案:

答案 0 :(得分:1)

P,我自己弄清楚了。首先,我发现延迟会导致 输出显示:

hello_3.js

console.log('Hello world!');
setTimeout(function () {
    process.exit(5);
}, 1000);

输出:

Hello world!
5

所以我仔细检查了consolefound的Node.js文档:

  

当目的地是终端或a时,控制台功能是同步的   文件(以避免在过早退出时丢失消息)和异步时   它是一个管道(以避免长时间阻塞)。

然后我决定确保没有使用管道并编写批处理脚本 hello_2.bat

@ECHO OFF
node hello_2.js >test
TYPE test

使用(call-process "cmd.exe" nil t nil "/C" "hello_2.bat")调用脚本时的输出:

Hello world!
0

(返回值为0而不是5,但我不关心)

回答我的问题:

  1. 看起来Windows上的Emacs中的call-process使用管道进行检索 程序输出。

    正如我也提到过EShell:它似乎没有被认为是一个 Windows上的Node.js终端,可能EShell内部使用call-process或 类似于运行程序。

  2. 检测管道作为标准输出的目的地会导致console.log 异步运行。

  3. Windows上的Node.js中的
  4. process.exit(5)似乎丢弃了所有预定的 异步任务,因此不会生成输出。

    这种假设得到了拼命将输出指向a的结果的支持 Windows命令提示符内的管道:

    C:\Temp> node hello_2.js | MORE
    
    C:\Temp>
    
  5. 最后,我发现大约一年前(截至2013年9月)问题是known