Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

280
Vistas
NodeJS child_process stdout, si el proceso está esperando stdin

Estoy trabajando en una aplicación que permite compilar y ejecutar el código proporcionado a través de una API.

El binario que quiero ejecutar se guarda como input_c y debe imprimir un texto, pidiéndole al usuario su nombre e imprimir otro texto después de recibir la entrada.

Funciona correctamente usando el siguiente código: primer texto - entrada (en la terminal) - segundo texto.

 const {spawn} = require('child_process'); let cmd = spawn('input_c', [], {stdio: [process.stdin, process.stdout, process.stderr]});

Producción:

 $ node test.js Hello, what is your name? Heinz Hi Heinz, nice to meet you!

Me gusta manejar stdout, stderr y stdin por separado y no escribirlo en la terminal. El siguiente código fue mi intento de lograr el mismo comportamiento que el anterior:

 const {spawn} = require('child_process'); let cmd = spawn('input_c'); cmd.stdout.on('data', data => { console.log(data.toString()); }); cmd.stderr.on('data', data => { console.log(data.toString()); }); cmd.on('error', data => { console.log(data.toString()); }); // simulating user input setTimeout(function() { console.log('Heinz'); cmd.stdin.write('Heinz\n'); }, 3000);

Producción:

 $ node test.js Heinz Hello, what is your name? Hi Heinz, nice to meet you!

Para simular la entrada del usuario, escribo en stdin después de 3000 ms. Pero aquí no recibo los primeros datos en stdout directamente en ejecución, parece esperar a stdin y genera todo a la vez.

¿Cómo puedo lograr el mismo comportamiento para mi segundo caso?

Se usó el siguiente código C para compilar el binario, pero para esto se puede usar cualquier aplicación que espere la entrada del usuario:

 #include <stdio.h> int main() { char name[32]; printf("Hello, what is your name? "); scanf("%s", name); printf("Hi %s, nice to meet you!", name); return 0; }
about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

node-pty se puede usar aquí para evitar la salida almacenada en búfer del proceso secundario.

 const pty = require('node-pty'); let cmd = pty.spawn('./input_c'); cmd.on('data', data => { console.log(data.toString()); }); // simulating user input setTimeout(function() { console.log('Heinz'); cmd.write('Heinz\n'); }, 3000);

producción:

 Hello, what is your name? Heinz Heinz Hi Heinz, nice to meet you!
about 4 years ago · Juan Pablo Isaza Denunciar

0

El problema al que se enfrenta con los eventos stdout.on() que no se activan después de spawn() aparece debido a cómo node.js genera el proceso secundario. Esencialmente, crea stream.pipe() (de forma predeterminada), lo que permite que el proceso secundario almacene en búfer la salida antes de enviarla a la salida stdout que le proporcionó el nodo, lo que, en general, es bueno para el rendimiento.

Pero, dado que desea una salida en tiempo real y también está a cargo del binario, simplemente puede deshabilitar el almacenamiento en búfer interno. En C , puede lograrlo agregando setbuf(stdout, NULL); al comienzo de su programa:

 #include <stdio.h> int main() { setbuf(stdout, NULL); char name[32]; printf("Hello, what is your name? "); scanf("%31s", name); printf("Hi %s, nice to meet you!", name); return 0; }

Alternativamente, puede llamar a fflush(stdout); después de cada printf() , puts() , etc:

 #include <stdio.h> int main() { char name[32]; printf("Hello, what is your name? "); fflush(stdout); scanf("%31s", name); printf("Hi %s, nice to meet you!", name); fflush(stdout); return 0; }

Al deshabilitar el almacenamiento en búfer interno o activar vaciados explícitos en el proceso secundario, obtendrá inmediatamente el comportamiento que espera, sin dependencias externas.

UPD:

Muchas aplicaciones suprimen intencionalmente o, al menos, permiten suprimir el almacenamiento en búfer de stdio, por lo que puede encontrar argumentos de inicio relacionados. Por ejemplo, puede iniciar el binario del intérprete de python con la opción -u , lo que obligará a stdin, stdout y stderr a estar totalmente sin búfer . También hay varias preguntas anteriores relacionadas con nodejs y problemas de stdio buffering problems , que pueden resultarle útiles, como esta: ¿Cómo puedo vaciar un proceso secundario de nodejs?

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda