【问题标题】:Bytes waiting in pipe [duplicate]管道中等待的字节[重复]
【发布时间】:2013-10-18 13:38:35
【问题描述】:

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

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

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

【问题讨论】:

  • 我不认为这是可以做到的,至少不能以便携的方式,但如果你解释为什么你需要这样做,可能有其他替代解决方案你的问题。

标签: c linux numbers byte pipe


【解决方案1】:

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

您最好的选择是将管道的读取端设置为非阻塞,然后直接读取。如果你的文件描述符设置为非阻塞,你在上面read 并且管道是空的,那么你很可能在errno 中得到EAGAIN 错误。这将向您表明管道仍处于打开状态,但此时只是空的。

您可以将文件描述符设置为非阻塞

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
}

【讨论】:

    猜你喜欢
    • 2016-10-16
    • 2015-11-09
    • 1970-01-01
    • 2018-03-26
    • 2019-11-21
    • 1970-01-01
    • 1970-01-01
    • 2021-10-09
    • 1970-01-01
    相关资源
    最近更新 更多