当前位置: 首页 > 面试题库 >

重定向时强制程序刷新其标准输出

雍志新
2023-03-14
问题内容

我有一个封闭的源程序,可以将输出打印到标准输出。我需要解析输出。因此,我使用dup2将输出重定向到FIFO(可以在分叉并执行二进制文件的父进程中从中读取),然后执行该程序。问题是文件中的fprintf调用被缓冲了,因为它现在正在写入文件。

我尝试在调用exec之前在sdout上使用_IONBF调用setvbuf。但是问题仍然存在。

为什么setvbuf对我的情况没有帮助?

我如何强制输出被冲洗?


问题答案:

setvbuf()没什么区别,因为它更改了C运行时库而不是OS的一部分的状态。当新进程开始运行时,它将重新初始化其C运行时库(也就是说,如果它完全使用CRT!)

我所知解决此问题的唯一方法是以某种方式伪造该过程的终端。这是因为大多数CRT库在默认情况下仅在相信连接到交互式终端的情况下才执行行缓冲(在Unix世界中:如果isatty()在文件描述符上返回true),否则它们将在更大的块中缓冲(通常为8Kb左右)
)。

该实用程序看起来像是一个很好的起点。



 类似资料:
  • 问题内容: 是否可以在Python中临时重定向stdout / stderr(即在方法期间)? 编辑: 当前解决方案的问题(我最初记得但后来忘记了)是它们没有 重定向 ;相反,它们只是完全替换了流。因此,如果某个方法由于某种原因(例如,由于将流作为参数传递给某物)而具有该变量的 本地 副本,则该方法将无效。 有什么办法吗? 问题答案: 要解决某些函数可能已将流作为局部变量缓存的问题,因此替换全局变

  • 我正在尝试从 Java 程序运行外部程序,但遇到了问题。基本上我想做的是这样的: 然而,我发现这是行不通的——Java apparent ls需要使用一个< code>Process来处理输入和输出流以及其他我不熟悉的东西。 我在互联网上看到了许多例子(其中许多来自SO),但似乎没有一个简单的标准方法来做到这一点,这对于一个不完全了解情况的人来说,可能会很沮丧。 我也很难从其他人的代码中构建自己的

  • 问题内容: 我在程序开始时,根据数据库中的某些内容,以编程方式在JScrollPane中添加了许多组件(JPanels,JLabels等)。 似乎对于GUI(?)而言,此过程太快了,因此JScrollPane并不总是正确更新,即,即使内部JPanel大于可见区域,滚动条也不可见。 调整窗口大小(JFrame)可以解决此问题,因为我认为Java在调整组件大小时会重新打印它们。 作为测试,我添加了一个

  • 我最近将Firebase remote config添加到我的项目中,以便远程管理一些应用程序设置。 由于Firebase的性质,配置只能在客户端每12小时更新一次。当我慢慢地将变量添加到远程配置中时,我意外地创建了以下场景: 用户的应用程序版本A在远程配置上的变量很少。 应用程序从Firebase更新变量 用户将应用程序版本更新为A+1,该版本在远程配置中具有新变量 应用程序尝试从firebas

  • 问题内容: 在bash中,调用将在stdout上显示该命令的任何输出。 调用会将该命令的任何输出重定向到指定的文件(在本例中为“输出”)。 有没有一种方法可以将输出重定向到文件 并 在stdout上显示? 问题答案: 您想要的命令名为 : 例如,如果您只关心标准输出: 如果要包括stderr,请执行以下操作: 将通道2(stderr /标准错误)重定向到通道1(stdout /标准输出),以便将两

  • 问题内容: 我会尽力解释这一点。 我有一个应用程序可以在页面上显示50多个项目。用户可以单击单个项目,然后转到页面以更新项目信息。一切工作正常,除了在用户完成更新单个项目信息并在浏览器上单击“后退”按钮到上一个按钮之后。旧项目信息(更新前)仍然存在。用户必须单击刷新才能查看更新的信息。不错,但我希望提供更好的用户体验。有解决这个问题的主意吗?非常感谢。 问题答案: 我认为您必须使用JS才能使此工作