代码之家  ›  专栏  ›  技术社区  ›  Community wiki

进程。退出(0):输出消失?

  •  4
  • Community wiki  · 技术社区  · 2 年前

    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) 导致输出被抑制?

    笔记:

    • 我在中遇到了这个问题 GNU Emacs 24.3.1(i386-mingw-nt5.1.2600)的 2013-03-17关于MARVIN Node.js版本0.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 回复  |  直到 12 年前
        1
  •  1
  •   feklee    12 年前

    哇,我自己想出来的。首先,我发现延迟会导致 将显示的输出:

    hello_3.js :

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

    输出:

    Hello world!
    5
    

    所以我仔细检查了Node.js文档 console found :

    当目的地是终端或 文件(以避免在提前退出时丢失消息)和异步 这是一个管道(为了避免长时间阻塞)。

    然后我决定确保不使用管道,并编写了一个批处理脚本 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. 看起来像 call-process 在Windows上的Emacs中,使用管道进行检索 程序输出。

      正如我也提到的EShell:它似乎没有被公认为 Windows上Node.js的终端,可能EShell内部使用 呼叫处理 或 类似于运行程序。

    2. 检测到管道作为标准输出原因的目的地 console.log 异步运行。

    3. process.exit(5) 在Windows上的Node.js中,似乎放弃了所有计划 异步任务,因此不生成输出。

      这一假设得到了拼命将输出导向 Windows命令提示符内的管道:

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

    最后,我发现问题是 known 自大约一年前(截至2013年9月)以来。