如何在不修改程序的情况下从标准输出捕获无缓冲的输出?

发布于 2024-08-06 22:14:22 字数 1027 浏览 8 评论 0原文

我正在编写一个用于运行程序的实用程序,我需要从程序中捕获无缓冲的标准输出和标准错误。我需要:

  • 捕获 stdout 和 stderr 以分隔文件。
  • 输出不需要缓冲(或行缓冲)。
  • 无需修改正在运行的程序的源代码。

问题是,当通过管道输出到文件时,标准输出流变成块缓冲而不是行缓冲。如果程序崩溃,输出永远不会被刷新,并且是空白的。所以我需要在没有缓冲(或使用行缓冲)的情况下捕获标准输出。

我认为这可以用 pty 来完成,但我很难找到任何完全符合我想要的示例(大多数忽略 stderr)。事实上,我不确定我是否在 C 语言中找到了任何 pty 示例;大多数使用更高级别的接口,例如 Python 的 pty 和 subprocess 模块。

任何人都可以提供帮助(使用代码片段或链接)吗?任何帮助将不胜感激。

编辑:我想我已经解决了。以下两个链接非常有帮助。

我的代码可作为存储库使用:

I'm writing a utility for running programs, and I need to capture unbuffered stdout and stderr from the programs. I need to:

  • Capture stdout and stderr to separate files.
  • Output needs to not be buffered (or be line buffered).
  • Without modifying the source of the program being run.

The problem is, when piping output to a file, the stdout stream becomes block buffered rather than line buffered. If the program crashes, the output never gets flushed, and is blank. So I need to capture stdout without buffering (or with line buffering).

I think this can be done with pty's but I'm having difficulty finding any examples that do exactly what I want (most ignore stderr). In fact, I'm not sure I've found any pty examples in C at all; most use a higher-level interface like Python's pty and subprocess modules.

Can anyone help (with code snippets or links)? Any help would be appreciated.

EDIT: I think I've solved it. The following two links were pretty helpful.

My code is available as a repository:

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

再可℃爱ぅ一点好了 2024-08-13 22:14:22

请参阅 man 7 pty


特别是:

Unix 98 伪终端

通过调用打开未使用的 Unix 98 伪终端主机
posix_openpt(3)。 (该函数打开主克隆设备,
/dev/ptmx;请参阅 pts(4)。)在执行任何特定于程序的初始化后,
更改从设备的所有权和权限
使用grantpt(3),并使用unlockpt(3)解锁从属设备),相应的
从设备可以通过传递返回的名称来打开
ptsname(3) 调用 open(2)

现在您知道了此类代码需要调用的库函数的名称,您可以做两件有用的事情:

  • 在 Google上查找其手册页
  • 以获取示例代码。既然您知道在搜索引擎中使用哪些关键字,我怀疑您在寻找示例时会更有运气。

see man 7 pty


In particular:

Unix 98 pseudo-terminals

An unused Unix 98 pseudo-terminal master is opened by calling
posix_openpt(3). (This function opens the master clone device,
/dev/ptmx; see pts(4).) After performing any program-specific initializations,
changing the ownership and permissions of the slave device
using grantpt(3), and unlocking the slave using unlockpt(3)), the corresponding
slave device can be opened by passing the name returned by
ptsname(3) in a call to open(2).

And now that you know the names of the library functions such a code will need to call, you can do two useful things:

  • Look up their man pages
  • Google for example code. Since you know what keywords to use with the search engine I suspect you will have much more luck hunting down examples.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文