Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

276
Views
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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!