c - 管道中等待的字节

标签 c linux numbers byte pipe

<分区>

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

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

这可能吗?感谢您的帮助。

最佳答案

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

最好的办法是将管道的读取端设置为非阻塞,然后继续读取。如果您的文件描述符设置为非阻塞,您在其上读取 并且管道为空,那么您将在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
}

关于c - 管道中等待的字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19451134/

相关文章:

java - 关于 Linux 上的 getBounds() 和 setBounds() 的 bug_id=4806603 的解决方法?

c - 将原始套接字绑定(bind)到特定地址

python随机数和比较

c - 查找给定整数的所有精确除数的算法

javascript - 以零数字开头的参数无法正确传递给 JavaScript 函数

c - 如何将整数转换为字符串以在 UART 上打印整数

c - mbed-OS 移植到 TivaC TM4123,动态中断处理问题

c - 我已经定义了我的函数,但仍然收到找不到定义的错误

php - 如何让 Symfony 启动进程 PID?

c - 如何从 C 中的函数参数中检索函数?