我正在编写一个远程终端应用程序,我使用管道从子进程的 stdout/stderr 获取数据,然后将其发送到客户端。具体来说,我正在运行 Linux,我并不真正关心可移植性(如果解决方案是仅限 Linux 的,那没关系)。
我需要知道当前已经写入了多少字节,但还没有从管道中读取。我在谷歌上搜索了很长时间,但找不到答案。我需要在不阻塞的情况下从管道中读取尽可能多的字节。
这可能吗?谢谢你的帮助。
这样做的唯一方法是尝试读取并计算您获得的字节数。recv
可以MSG_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
}