一旦可用,就读取子进程的输出?

时间:2010-08-01 15:05:36

标签: c linux process pipe redirect

我一直在尝试各种方法(popen,pipes + fork / exec,...)来读取子进程的输出,所有这些都有效,但表现出相同的行为:每当我尝试读取输出时使用read / fread时,它仅在缓冲区完全填满或子进程退出时返回。我正在寻找一种更类似于套接字的行为:只要有一些数据可用就会读取任何数据。

我该怎么做?

2 个答案:

答案 0 :(得分:4)

一般情况下,你没有。特别是,子进程将缓冲流,因为它不会将连接到管道的流视为“交互式”。由于缓冲是在子进程内发生的,关于防止它的唯一方法是重写子进程中的代码以防止它缓冲其标准输出(无论是,还是通过特定的开关,或者你可以添加代码检测何时连接到管道并仅在特定情况下关闭缓冲)。但是,如果它对标准输出写得太多,那么这会影响孩子的表现(特别是如果你没有选择何时禁用缓冲)。

答案 1 :(得分:2)

我认为这不可行。缓冲是在孩子的一边处理的,如果没有刷新缓冲区,你就无需阅读。但是,一些工具具有控制缓冲的命令行选项,例如, grep --line-buffered