Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 等待在管道中的字节_C_Linux_Numbers_Byte_Pipe - Fatal编程技术网

C 等待在管道中的字节

C 等待在管道中的字节,c,linux,numbers,byte,pipe,C,Linux,Numbers,Byte,Pipe,我正在编写一个远程终端应用程序,我使用管道从子进程的stdout/stderr获取数据,然后将其发送到客户端。具体地说,我运行的是Linux,我并不真正关心可移植性(如果解决方案仅限于Linux,那么就可以了) 我需要知道有多少字节当前已写入管道,但尚未从管道中读取。我在谷歌上搜索了很长时间,找不到答案。我需要在不阻塞的情况下从管道中读取尽可能多的字节 这可能吗?谢谢您的帮助。唯一的方法是尝试读取并计算得到的字节数recvwithMSG_PEEK可以做到这一点 最好的办法是将管道的读取端设置为非

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

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


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

唯一的方法是尝试读取并计算得到的字节数
recv
with
MSG_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
}

我认为这是不可能做到的,至少不能以可移植的方式做到,但是如果你解释为什么你需要这样做,可能还有其他的解决方法。