nodejs node code child windows node.js emacs elisp

windows - node - process spawn



process.exit(0): ¿la salida desaparece? (1)

Uff, me di cuenta yo mismo. En primer lugar, descubrí que un retraso hace que aparezca la salida:

hello_3.js :

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

Salida:

Hello world! 5

Así que revisé dos veces la documentación de Node.js para la console , y encontré :

Las funciones de la consola son síncronas cuando el destino es un terminal o un archivo (para evitar mensajes perdidos en caso de salida prematura) y asíncrono cuando es un conducto (para evitar el bloqueo durante largos períodos de tiempo).

Luego decidí asegurarme de que no se utilizaba ninguna tubería y escribí una secuencia de comandos por lotes hello_2.bat :

@ECHO OFF node hello_2.js >test TYPE test

Salida al llamar al script con (call-process "cmd.exe" nil t nil "/C" "hello_2.bat") :

Hello world! 0

(el valor de retorno es 0 en vez de 5, pero eso no me importa)

Para responder mi pregunta:

  1. Parece que call-process en Emacs en Windows usa un conducto para recuperar los resultados de los programas.

    Como también mencioné EShell: No parece ser reconocido como un terminal por Node.js en Windows, y posiblemente EShell usa internamente call-process o similar para ejecutar programas.

  2. La detección de un conducto como destino para la salida estándar hace que console.log se ejecute de forma asíncrona.

  3. process.exit(5) en Node.js en Windows parece descartar todas las tareas asincrónicas programadas y, por lo tanto, no se genera ninguna salida.

    Esta suposición es respaldada por el resultado de dirigir desesperadamente la salida a una tubería dentro del símbolo del sistema de Windows:

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

Finalmente, descubrí que el problema se conoce desde hace aproximadamente un año (a partir de septiembre de 2013).

Emacs lisp command calling node hello.js :

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

Dos variantes de hello.js :

  • hello_1.js :

    console.log(''Hello world!'');

    Salida:

    Hello world! 0

  • hello_2.js :

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

    Salida (sin salida de la declaración de registro!):

    5

¿Cuál es la razón por la cual process.exit(5) hace que se suprima el resultado?

Notas:

  • Experimenté el problema en GNU Emacs 24.3.1 (i386-mingw-nt5.1.2600) de 2013-03-17 en MARVIN en combinación con Node.js v0.10.18 , que se ejecuta en Windows XP / SP3 / 32 .

  • Intenté que EShell ejecutara la línea de comando del nodo: sin salida

  • process.exit() llama al nivel bajo process.reallyExit() , que causa el problema: sin salida

    process.reallyExit() se implementa en C ++:

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

    [...]

    NODE_SET_METHOD(process, "reallyExit", Exit);