生成的进程的标准输出在通过管道传输时工作异常

亚历克斯

我的目标是将某些流程执行的会话保存到json(类似[{ type: 'stdout', data: 'What's your name?' }, { type: 'stdin', data: 'Alex.' }, { type: 'stdout', data: 'Hi, Alex!' }])。我决定用nodejs来做,但是遇到了一些问题。生成的标准输出在通过管道传输和继承时的工作方式有所不同。因此,例如,我将此C代码(简单猜测数字游戏)编译为main

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void) {
  int random_num = 0;
  int guessed_num = 0;
  int counter = 0;

  srand(time(NULL));
  random_num = rand() % 10 + 1;

  printf("Guess my number! ");

  while(1) {
    counter++;

    scanf("%d", &guessed_num);

    if (guessed_num == random_num) {
      printf("You guessed correctly in %d tries! Congratulations!\n", counter);
      break;
    }

    if (guessed_num < random_num)
      printf("Your guess is too low. Guess again. ");

    if (guessed_num > random_num)
      printf("Your guess is too high. Guess again. ");
  }

  return 0;
}

这段JavaScript代码:

var spawn = require('child_process').spawn;
var child = spawn('./main', { stdio: 'inherited' });

该JavaScript代码的执行结果将是:

Guess my number! 1
Your guess is too low. Guess again. 2
Your guess is too low. Guess again. 3
You guessed correctly in 3 tries! Congratulations!

但是,当stdiois时inherited,我无法附加到任何流程流并将数据保存到json。所以我尝试了这个:

var spawn = require('child_process').spawn;
var child = spawn('./main', { stdio: 'pipe' });
child.stdout.on('data', function(data) { process.stdout.write(data) });
process.stdin.on('data', function(data) { child.stdin.write(data) });

并通过执行得到此结果:

1
2
3
Guess my number! Your guess is too low. Guess again. Your guess is too low. Guess again. You guessed correctly in 3 tries! Congratulations!

当子进程正在等待输入时,子进程的标准输出会以某种方式挂起。它可能与事件循环有关,但我不确定。无论如何,inheritedand的行为pipe都非常不同,这似乎是错误的...

我该怎么办?也许有一些解决方法?

弗雷德里克·杜威特(Frederik Deweerdt)

inherited模式下,C程序继承绑定到终端的描述符。终端是一个交互式设备,它会自动将要进行printf()功能缓冲的功能设置stdout为行缓冲(即遇到新行时刷新缓冲区)。

OTOH,在pipe模式下,libc不会检测到交互式设备,而是切换到完全缓冲(即,仅在缓冲区已满或被fflush()调用时才刷新缓冲区)

一种解决方法是fflush(stdout)在每次调用printf()调用,或者禁用所有缓冲stdoutsetvbuf(stdout, NULL, _IONBF, 0);

有关管道与终端缓冲的完整说明,请参见此答案,包括libc确定对的缓冲的示例stdout

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

生成的进程的标准输出在通过管道传输时工作异常

来自分类Dev

我如何等待 Rust `Child` 进程的标准输出已通过管道传输到另一个进程?

来自分类Dev

与通过管道传输到文件时相比,ag输出在终端中显得有所不同

来自分类Dev

进程如何在其输出通过管道传输时消除转义码?

来自分类Dev

如何将标准输出通过管道传输到另一个进程,同时在本地文件中捕获标准输出?

来自分类Dev

我可以通过管道传输已启动进程的输出吗?

来自分类Dev

Unix 程序如何知道在通过管道传输时更改输出?

来自分类Dev

为什么我不能将汇编器输出通过管道传输到标准输出?

来自分类Dev

通过管道传输时,sed无法正常工作

来自分类Dev

如何将终端标准输出(stdout)通过管道传输到剪贴板?

来自分类Dev

如何将终端标准输出(stdout)通过管道传输到剪贴板?

来自分类Dev

如何将标准输出通过管道传输到另一个程序?

来自分类Dev

管道传输到文件时,在 Powershell 中调用的 Python 脚本无法写入标准输出

来自分类Dev

调试时QtCreator的标准输出在哪里?

来自分类Dev

调试时QtCreator的标准输出在哪里?

来自分类Dev

脚本运行缓慢处理从服务管道传输的标准输出

来自分类Dev

当通过管道传输输出时,为什么某些“ for”命令不起作用?

来自分类Dev

通过CMD和PowerShell进行管道传输时,行为和输出不同

来自分类Dev

为什么通过管道传输程序输出时 journalctl 不显示日志?

来自分类Dev

为什么 `echo` 可以工作,而在通过管道传输到 `openssl` 时 `cat` 不行

来自分类Dev

持久性子进程管道 - 无需读取标准输出

来自分类Dev

c-无法通过管道传输三个进程

来自分类Dev

如何通过mv通过管道传输tar的输出?

来自分类Dev

如何通过管道生成SQL输出

来自分类Dev

我无法将终端输出通过管道传输到文件

来自分类Dev

水星。色彩输出通过管道传输到更少

来自分类Dev

我无法将终端输出通过管道传输到文件

来自分类Dev

如何通过管道将任何内容传输到音频输出?

来自分类Dev

停止grep解析通过管道传输到文件的自身输出

Related 相关文章

  1. 1

    生成的进程的标准输出在通过管道传输时工作异常

  2. 2

    我如何等待 Rust `Child` 进程的标准输出已通过管道传输到另一个进程?

  3. 3

    与通过管道传输到文件时相比,ag输出在终端中显得有所不同

  4. 4

    进程如何在其输出通过管道传输时消除转义码?

  5. 5

    如何将标准输出通过管道传输到另一个进程,同时在本地文件中捕获标准输出?

  6. 6

    我可以通过管道传输已启动进程的输出吗?

  7. 7

    Unix 程序如何知道在通过管道传输时更改输出?

  8. 8

    为什么我不能将汇编器输出通过管道传输到标准输出?

  9. 9

    通过管道传输时,sed无法正常工作

  10. 10

    如何将终端标准输出(stdout)通过管道传输到剪贴板?

  11. 11

    如何将终端标准输出(stdout)通过管道传输到剪贴板?

  12. 12

    如何将标准输出通过管道传输到另一个程序?

  13. 13

    管道传输到文件时,在 Powershell 中调用的 Python 脚本无法写入标准输出

  14. 14

    调试时QtCreator的标准输出在哪里?

  15. 15

    调试时QtCreator的标准输出在哪里?

  16. 16

    脚本运行缓慢处理从服务管道传输的标准输出

  17. 17

    当通过管道传输输出时,为什么某些“ for”命令不起作用?

  18. 18

    通过CMD和PowerShell进行管道传输时,行为和输出不同

  19. 19

    为什么通过管道传输程序输出时 journalctl 不显示日志?

  20. 20

    为什么 `echo` 可以工作,而在通过管道传输到 `openssl` 时 `cat` 不行

  21. 21

    持久性子进程管道 - 无需读取标准输出

  22. 22

    c-无法通过管道传输三个进程

  23. 23

    如何通过mv通过管道传输tar的输出?

  24. 24

    如何通过管道生成SQL输出

  25. 25

    我无法将终端输出通过管道传输到文件

  26. 26

    水星。色彩输出通过管道传输到更少

  27. 27

    我无法将终端输出通过管道传输到文件

  28. 28

    如何通过管道将任何内容传输到音频输出?

  29. 29

    停止grep解析通过管道传输到文件的自身输出

热门标签

归档