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

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

    输出(日志语句不输出):

     5 

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

笔记:

  • 我遇到了MARVIN的2013-03-17的GNU Emacs 24.3.1(i386-mingw-nt5.1.2600)和Windows XP / SP3 / 32上运行的Node.js v0.10.18的问题

  • 我尝试了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); 

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

hello_3.js

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

输出:

 Hello world! 5 

所以我再次检查console Node.js文档, 发现 :

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

然后我决定确保没有使用管道,并写了一个批处理脚本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中的process.exit(5)似乎放弃了所有预定的异步任务,因此不会生成输出。

    在Windows命令提示符下拼命地将输出指向管道的结果支持这种假设:

     C:\Temp> node hello_2.js | MORE C:\Temp> 

最后,我发现从大约一年前(截至2013年9月)就已经知道这个问题。