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

时间:2009-10-11 18:50:12

标签: c linux pty

我正在编写一个用于运行程序的实用程序,我需要从程序中捕获无缓冲的stdout和stderr。我需要:

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

问题是,当将输出传递给文件时,stdout流变为块缓冲而不是行缓冲。如果程序崩溃,则输出永远不会被刷新,并且是空白的。所以我需要在没有缓冲(或使用行缓冲)的情况下捕获stdout。

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

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

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

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

1 个答案:

答案 0 :(得分:2)

请参阅man 7 pty


特别是:

  

Unix 98伪终端

     

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

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

  • 查看他们的手册页
  • Google代码示例。既然你知道搜索引擎使用什么关键词,我怀疑你会有更多的运气来寻找例子。