问题标签 [unbuffered-output]

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 投票
6 回答
3648 浏览

c - 分段错误问题

我观察到,有时在 C 程序中,如果我们printf在分段错误之前的任何地方都有 in 代码,它不会打印。为什么会这样?

0 投票
8 回答
40525 浏览

oracle - Oracle PL/SQL - 即时输出/控制台打印的技巧

我有许多可能需要几分钟才能运行的 pl/sql 程序。在开发它们时,我添加了一些打印语句来帮助调试并提供一些反馈和进度指示器。最初,我在小型测试集上运行这些,输出几乎是瞬时的。现在我正在使用需要几分钟才能运行的大型测试集进行测试,我发现打印到控制台不再合适,因为在程序结束之前什么都不会打印。我习惯于在不缓冲其输出并立即打印它的环境中工作,并且添加简单的打印语句以进行简单的调试和诊断是很常见的。

在 pl/sql 中是否可以立即打印输出(不缓冲)?如果不是,人们推荐什么替代方案来获得类似的结果?

0 投票
6 回答
19774 浏览

bash - bash:强制执行的进程具有无缓冲的标准输出

我有一个像这样的脚本:

问题是some_binary将其所有日志记录发送到标准输出,并且缓冲使我只能看到几行块的输出。当某些事情卡住时,这很烦人,我需要看看最后一行说什么。

在我执行会影响 some_binary 的 exec 之前,有什么方法可以使 stdout 无缓冲,因此它具有更有用的日志记录?

(包装脚本只是在 exec 之前设置了一些环境变量,因此 perl 或 python 中的解决方案也是可行的。)

0 投票
1 回答
2279 浏览

android - Android:将文件保存到内部数据时需要 BufferedOutputStream 吗?

我想将字符串保存到文件中并读回,所以我遵循了这两个示例:

但是,它们都没有使用 BufferedOutputStream 包装器,而FileOutputStream 的文档推荐它。

这样做是为了有一个更简单的例子,还是在 Android 上真的没有必要?答案是否也适用于 InputStream?

问候,水母

0 投票
1 回答
365 浏览

bash - 如何在没有缓冲区的情况下保存 tty?

我在使用缓冲区时遇到问题:

我有一个守护进程D,它的监视器M。D在M之前启动,M将任何相关信息打印到tty,我需要解析这些信息并将其交给我自己的程序。

由于我想自动执行此操作,因此 M 应该打印到文件中。但是直到守护进程被杀死,因为缓冲区。

所以我正在考虑记录 tty,因此尝试使用脚本将输出记录到终端但是......它也被缓冲了......

我还尝试访问 gnu coreutils(以使用我显然需要的 stdbuf),但是当我无法安装该实用程序以解压缩 GNU 网站上提出的特殊 .xz 格式时不得不放弃!

我担心我什至没有做正确的事!对于这个问题,难道没有一个简单的解决方案,可能每个实时工作的人都有吗?

一点帮助将不胜感激。谢谢。

0 投票
2 回答
3777 浏览

python - Windows 中 Python 的缓冲输出与非缓冲输出

我使用 NppExec/Notepad++ 来运行 Python 脚本,并在运行时不断刷新我的输出缓冲区以使用print语句更新我的控制台窗口(默认缓冲输出仅在脚本完成执行后显示所有打印语句)。

链接显示您需要做的就是使用该命令python -u来获取无缓冲的输出。无论使用哪种编辑器,对我的所有Python 脚本都使用这种执行模式是否有不利之处?我不清楚缓冲输出和非缓冲输出之间的区别。

编辑:我包含了这个小的 Python 计时器脚本作为示例:

在这种情况下,缓冲和非缓冲输出在效率方面有多大区别?

0 投票
3 回答
3010 浏览

windows - Windows 上的 unbuffer 程序相当于什么?

嗨,根据这篇文章unbuffer通过伪终端(pty)连接到命令,这使得系统将其视为交互式进程,因此不使用任何标准输出缓冲。

我想在 Windows 上使用这个功能。我可以知道什么是unbufferWindows 上的程序等价物吗?谢谢。

0 投票
2 回答
4739 浏览

python - 检测子进程何时等待输入

我正在编写一个 Python 程序,用于在 Linux 服务器上运行用户上传的任意(因此,在最坏的情况下,不安全、错误和崩溃)代码。除了安全问题之外,我的目标是确定代码(可能是任何语言,编译或解释)是否将正确的stdout内容stderr写入stdin. 在此之后,我需要向用户显示结果。

目前的解决方案

目前,我的解决方案是subprocess.Popen(...)使用stdout,stderrstdin. 句柄后面的文件stdin包含程序在运行期间读取的输入,在程序终止后,将读取stdoutstderr文件并检查其正确性。

问题

这种方法在其他方面效果很好,但是当我显示结果时,我无法组合给定的输入和输出,以便输入出现在与从终端运行程序时相同的位置。即对于像这样的程序

包含程序的文件的内容stdout在运行后将是:

鉴于包含 的文件的内容stdinAnonymous<LF>. 因此,简而言之,对于给定的示例代码(以及等效地,对于任何其他代码),我希望获得如下结果:

因此,问题在于检测程序何时等待输入。

尝试过的方法

我尝试了以下方法来解决问题:

Popen.communicate(...)

这允许父进程沿管道单独发送数据,但只能调用一次,因此不适合具有多个输出和输入的程序 - 正如可以从文档中推断的那样。

直接从Popen.stdoutPopen.stderr读取并写入Popen.stdin

文档对此提出警告,当程序开始等待输入时,Popen.stdouts.read()和调用似乎无限阻塞。.readline()

用于select.select(...)查看文件句柄是否已准备好进行 I/O

这似乎没有任何改善。显然管道总是准备好读取或写入,所以select.select(...)在这里没有多大帮助。

使用不同的线程进行非阻塞读取

正如这个答案中所建议的,我尝试创建一个单独的Thread()来存储从读取stdoutQueue()的结果。要求用户输入的行之前的输出行显示得很好,但程序开始等待用户输入的行("Type your name: "在上面的示例中)永远不会被读取。

使用PTY slave 作为子进程的文件句柄

按照这里的指示,我尝试pty.openpty()创建一个带有主从文件描述符的伪终端。之后,我给出了从属文件描述符作为subprocess.Popen(...)调用的参数stdoutstderrstdin参数。读取打开的主文件描述符os.fdopen(...)会产生与使用不同线程相同的结果:要求输入的行不会被读取。

编辑:使用@Antti Haapala 的pty.fork()子进程创建示例而不是subprocess.Popen(...)似乎允许我也阅读由raw_input(...).

使用pexpect

我还尝试了使用 pexpect 生成的进程的read(),read_nonblocking()readline()方法(在此处read_nonblocking()记录),但是我得到的最佳结果与以前相同:在希望用户输入之前带有输出的行没有阅读。与使用创建的 PTY 相同:确实会读取pty.fork()要求输入的行。

编辑:通过在我的创建子程序的主程序中使用sys.stdout.write(...)andsys.stdout.flush()而不是printing ,似乎修复了提示行未显示的问题——尽管它实际上在两种情况下都被读取了。

其他

我也试过select.poll(...),但似乎管道或 PTY 主文件描述符总是准备好写入。

笔记

其他解决方案

  • 我还想到的是在一段时间过去而没有生成新输出的情况下尝试输入输入。然而,这是有风险的,因为无法知道程序是否正在执行繁重的计算。
  • 正如@Antti Haapala 在他的回答中提到的那样,read()可以替换来自 glibc 的系统调用包装器以将输入传达给主程序。但是,这不适用于静态链接或汇编程序。(虽然,现在我想起来了,任何这样的调用都可以从源代码中截获并替换为read()- 的修补版本可能仍然很难实现。)
  • 修改 Linux 内核代码以将read()系统调用传达给程序可能是疯狂的......

PTY

我认为 PTY 是要走的路,因为它伪造了一个终端,并且交互式程序在任何地方的终端上运行。问题是,怎么做?

0 投票
1 回答
268 浏览

perl - Perl:在运行时打印日志,而不是稍后一次全部转储

我有一个从 Jenkins slave 运行的 Perl 脚本。该脚本执行一个保存在远程机器 A 上的 shell 脚本。这个 shell 脚本实际上在机器 A 本身上部署了 war。两台机器,Jenkins slave 和 remote box 都是 CentOS 实例。

现在的问题是,虽然程序运行良好,但它会在一段时间后打印输出。整个输出在 $stdout 中捕获,然后转储。由于此作业作为 Jenkins 作业运行,因此最终用户在转储输出之前不知道发生了什么。我想在事件发生(运行时)时打印每一行,而不是等待整个输出存储在变量中并稍后转储。我确实阅读了这篇文章,但我不确定它是否适用于我的案例,如果适用,我该如何实施。我确实尝试将其放在$| = 1;脚本的顶部。它没有用。然后我尝试在初始化 ssh 对象之前放置它,但它在任何情况下都不起作用。顺便提一下,在我的场景中,效率不是问题。

任何帮助将不胜感激。

0 投票
1 回答
598 浏览

c - C - write() 系统调用打印乱码而不是 pid_t

以下代码:

打印乱码而不是实际的 pid。为什么?