在管道中等待的字节

时间:2013-10-18 13:38:35

标签: c linux numbers byte pipe

我正在编写一个远程终端应用程序,我使用管道从子进程'stdout / stderr获取数据,然后将其发送到客户端。具体来说,我正在运行Linux,我并不关心可移植性(如果解决方案只是Linux,那就没关系。)

我需要知道当前已经写入了多少字节,但尚未读取管道。谷歌搜索了很长时间,无法找到答案。我需要从管道中读取尽可能多的字节而不会阻塞。

这可能吗?谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

执行此操作的唯一方法是尝试读取并计算您获得的字节数。 recvMSG_PEEK可以做到这一点。

您最好的选择是将管道的读取端设置为非阻塞,然后只需提前读取。如果您的文件描述符设置为非阻止,那么您read上的管道为空,那么您在EAGAIN中会出现errno错误。这将告诉您管道仍处于打开状态,但此刻只是空的。

您可以使用

将文件描述符设置为非阻止
fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) & ~O_NONBLOCK);

然后阅读:

while (read(fd, buffer, sizeof(buffer))) {
    if (errno == EAGAIN) {} // buffer currently empty
    else if (errno) {perror("read")} // an error happened
}