问题标签 [unbuffered]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
7531 浏览

c - setvbuf 无法使标准输入无缓冲

我的主要目的是在getchar获得角色后立即返回,而不是等待ENTER密钥。我试过这个

将其与原型进行比较setvbuf

它应该设置stdin为无缓冲模式。

但还是getchar()一直在等待ENTER

我看过类似这样的相关帖子

在 C 中读取字符时打印

这是建议使stdin无缓冲的替代方法。但我很想知道为什么setvbuf方法不起作用

0 投票
5 回答
14600 浏览

c++ - 缓冲和非缓冲流

在缓冲流的情况下,它在一本书中说它会等到缓冲区满后再写回监视器。例如:

  1. “缓冲区已满”是什么意思。

    /li>
  2. 在我的书中说发送到cerr的所有内容都会立即写入标准错误设备,这是什么意思?

    /li>
  3. 在这个例子ch中将分配给“hello”,而“world”将被忽略,这是否意味着它仍在缓冲区中并且会影响未来语句的结果?

0 投票
1 回答
1179 浏览

node.js - 使 lftp 写入标准输出而无需先关闭进程

我正在尝试使用 child_process 将 lftp 程序包装在 node.js 应用程序中。问题是 lftp 不会将其输出写入标准输出,因此我无法在 node.js 中捕获其输出。示例代码:

如果我取消注释为 lftp 子进程调用 stdin.end() 的行,则 ls 命令的输出将按原样出现在我的终端中。如果我不这样做,该过程只会挂起并且没有任何输出。

我也尝试过使用 unbuffer,但它似乎不再允许我写入 lftp 的标准输入。它输出通常的“[解析主机地址...]”内容,但不输出 ls 命令的输出。

我的问题是:我必须做些什么才能使用 node.js 的 child_process 与 lftp 交互?

0 投票
1 回答
6158 浏览

linux - Linux,串口,非缓冲模式

我正在尝试在 Linux 中使用串行端口组织 nob-blocking 读写功能。这是我的代码:http ://pastebin.com/RSPw7HAi 一切正常,但它是缓冲的。这意味着,如果我通过控制台 + CR 符号向串行输入,则选择检测新输入,否则,如果我通过简单的 python 脚本输入,它会缓冲所有符号并等待直到我发送回车符号。因此,有了这个输入(如下所示),它只是在某处缓冲符号。我必须通过 USB2Serial 转换器连接 PC

那么,谁能告诉我在这里做什么?我是否必须在我的 C 文件中的端口打开中更改某些内容,或者使用 python 脚本来完成?后来我使用了 flush() 方法,但它也没有帮助。顺便说一句,我已经用谷歌搜索了 F_NOCACHE arg 到 fcntl() 函数。但!据我所知,这都是关于 BSD 和达尔文操作系统的,Linux 中没有这样的东西(F_NOACHE arg 到 fcntl)。

UPD:看起来我找到了解决方案。

取自:http ://tldp.org/HOWTO/Serial-Programming-HOWTO/x115.html

0 投票
0 回答
423 浏览

c++ - C++ 和 Python 之间的无缓冲通信

我想在 Linux 中将数据从 C++ 传递到 Python,我通过管道完成此操作。我的 C++ 程序如下所示:

对应的 python 函数 plot.py 如下所示:

现在我的问题是,在将数据传递给 python 函数之前,我的 c++ 函数中似乎有数据缓冲,我无法摆脱它。我一直在寻找解决方案,但找不到任何解决方案。我能找到的最好的建议是在 c++ 函数中使用 setvbuf,所以我还尝试在 c++ 函数中包含以下行

但这没有任何影响。

有谁知道我如何以无缓冲的方式将数据从我的 c++ 函数传递给 python?

0 投票
1 回答
1951 浏览

java - 读取其他进程的**无缓冲**输出流

我正在为java中的文件转换器编写一个小GUI。文件转换器将其当前进度写入标准输出。看起来像这样:

Flow_1.wav: 28% complete, ratio=0,447

我想在进度条中说明这一点,所以我正在阅读流程的标准输出,如下所示:

现在的问题是,无论我选择哪种字节数组大小,都会以 4 KB 的块读取流。所以我的代码正在执行,直到length = stream.read(b);然后阻塞了很长一段时间。一旦进程生成了 4 KB 的输出数据,我的程序就会获取这个块并在 32 字节切片中处理它。然后再次等待下一个 4 KB。

我试图强制 java 使用较小的缓冲区,如下所示:

或这个:

但两者都没有改变任何东西。

然后我发现了这个:Process source (about line 87)

似乎 Process 类的实现方式是将进程的标准输出通过管道传输到文件。那么proc.getInputStream();实际上所做的是将流返回到文件。而且这个文件似乎是用 4 KB 缓冲区写入的。

有谁知道这种情况的某种解决方法?我只想立即获得流程的输出。

编辑:正如 Ian Roberts 所建议的,我还尝试将转换器的输出通过管道传输到 stderr 流中,因为该流似乎没有包装在BufferedInputStream. 仍然是 4k 块。

另一个有趣的事情是:我实际上并没有得到 4096 个字节,而是大约 5 个字节。恐怕它FileInputStream本身是本机缓冲的。

0 投票
3 回答
14863 浏览

node.js - Node.js 使用单独的 stdout 和 stderr 流以交互方式生成子进程

考虑以下 C 程序 (test.c):

哪个应该打印一行到stdout,一行到stderr,然后等待用户输入,然后另一行到stdout,另一行到stderr。很基础!编译并在命令行上运行完成时程序的输出(getchar() 接收用户输入):

当尝试使用带有以下代码的 nodejs 将该程序作为子进程生成时:

输出如下所示:

与在终端中运行 ./test 时看到的输出非常不同。这是因为 ./test 程序在由 nodejs 生成时没有在交互式 shell 中运行。test.c 标准输出流被缓冲,并且当在终端中运行时,一旦到达 \n,缓冲区就会被刷新,但是当使用节点以这种方式产生时,缓冲区不会被刷新。这可以通过在每次打印后刷新标准输出来解决,或者将标准输出流更改为无缓冲以便立即刷新所有内容。假设 test.c 源不可用或不可修改,则提到的两个刷新选项都不能实现。

然后我开始研究模拟交互式外壳,有 pty.js(伪终端),它做得很好,例如:

哪个输出:

但是,stdout 和 stderr 都合并在一起(正如您在终端中运行程序时所看到的那样),我想不出一种将数据与流分开的方法。

所以问题..

有什么方法可以使用 nodejs 来实现运行 ./test 时看到的输出而不修改 test.c 代码?通过终端仿真或进程生成或任何其他方法?

干杯!

0 投票
2 回答
1915 浏览

c - 来自 STDIO 的 Linux 无缓冲读取

我正在尝试重写wc -l显示部分结果的副本,因为它接收输入(例如,

我当前的版本很简单

问题是我stdin的仍然被块缓冲。这个练习的重点是让输出不必等待每个 4KB 块填满。我想行缓冲会很好。

示例应用:find | partial_wc

awk 'NR%1000==0 {printf "%d\r",NR} END {print NR}'有类似的输出,除了我想选择基于时间(例如每 1 秒)而不是行输出。此外,这是一个有趣的学习问题。

我尝试接受在为什么 grep 快速中给出的建议,但无法弄清楚要使用哪组系统调用。

0 投票
0 回答
188 浏览

python - How to set stdout unbuffered on a per-machine basis?

I ran into a case in which my machine buffered stdout, but a coworker's machine did NOT buffer stdout for the exact same code. We're running nearly identical environments (we're both using the same virtual machine image in VMware Player, but he on a Mac, and I on a PC). The code uses Popen() to execute one python script from another, and the executed script buffers stdout on my machine, but not his.

I know of these ways to control python's buffering of stdout: Disable output buffering

But neither machine had the PYTHONUNBUFFERRED environment variable set, and none of the programmatic means for unbuffering stdout were employed in any of the code.

Incidentally, adding "-u" to the Popen() call caused stdout to be unbuffered on my machine, but did not change the behavior on his.

Taking into account that preamble, what other things might cause stdout to be buffered on one machine and unbuffered on another, for otherwise identical code?

This might be esoteric, but it's important that I be able to give a thorough explanation, and I've run out of ideas for search strings.

EDIT: The initial program can be invoked from either the command-line or a desktop link (which issues a bash command). The VM is running Ubuntu Linux. I will try to post a simple code example, but that may take some time.

Thinking about invocation, I just realized that I usually launch from the command line and he usually launches from the desktop shortcut, which might be the critical difference. But I still don't know why...

Here is some code that demonstrates what I'm doing (mostly; there's much more to it, but it's hard for me to know what's relevant).

The invoking script calls Popen, and then does a non-blocking buffered read, by selecting on stdout to read a character until it gets a \n or there's nothing to read.

The invoked script basically just prints a line of text using "print" (not reproduced here).

0 投票
1 回答
411 浏览

java - 无缓冲和缓冲流

我正在尝试编写一个程序,它只读取和写入一个无缓冲的流,并读取和写入一个缓冲的流。按照 java 文档上的示例,我为我的缓冲流提供了这个,它工作正常。

然而,Java 文档说“您可以在 CopyCharacters 示例中修改构造函数调用以使用缓冲 I/O:”。

我的问题是如何实现它。是否可以将其全部添加到一个类中?当我尝试添加它时,我收到一条错误消息:

“找不到符号 - 类 BufferedReader”

任何帮助都会很棒。谢谢。