Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

277
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda