在不调用read()的情况下确定管道的大小

8 c c++ unix linux

我需要一个名为SizeOfPipe()的函数,它应该返回管道的大小 - 我只想知道管道中有多少数据,而不是实际从管道本身读取数据.

我认为以下代码可行

fseek (pPipe, 0 , SEEK_END);
*pBytes = ftell (pPipe);
rewind (pPipe);
Run Code Online (Sandbox Code Playgroud)

但是fseek dosent在文件描述符上工作.另一个选择是读取管道然后写回数据但是如果可能的话,我想避免这个,任何建议?

Vol*_*erK 16

根据您的unix实现,ioctl/FIONREAD可能会起作用

err = ioctl(pipedesc, FIONREAD, &bytesAvailable);

除非返回"无效参数"(或任何其他错误)的错误代码,否则bytesAvailable包含当时可用于解除阻塞读取操作的数据量.


CL.*_*CL. 6

某些UNIX实现返回st_size调用后可在字段中读取的字节数fstat(),但这不可移植.


moo*_*dow 2

通常不可能仅从管道句柄知道可以从管道读取的数据量。数据可能通过网络传入,或者由另一个进程动态生成。如果您需要预先了解,您应该安排信息通过管道或带外发送给您,无论管道另一端的进程如何。