C++ 检测文件描述符何时来自/proc

C++ 检测文件描述符何时来自/proc,c++,c,linux,linux-kernel,C++,C,Linux,Linux Kernel,无法以正常方式读取/proc目录中的文件。特别是,fstat会告诉您,即使存在内容,文件大小也为零 这会对我的一些文件读取代码造成严重破坏,这些代码在读取之前会首先询问文件大小。基本上,在获得EOF之前,您必须从/proc读取文件,就像读取管道或stdin-read一样 但是,如何检测文件描述符或文件*是否来自/proc 在做了一个fstat之后查看stat的内容,我看不出有任何明确的方法可以检测到这一点。在st_模式下,或者所有权或权限都不能确定地告诉我它来自/proc 设备id看起来很有希望

无法以正常方式读取/proc目录中的文件。特别是,fstat会告诉您,即使存在内容,文件大小也为零

这会对我的一些文件读取代码造成严重破坏,这些代码在读取之前会首先询问文件大小。基本上,在获得EOF之前,您必须从/proc读取文件,就像读取管道或stdin-read一样

但是,如何检测文件描述符或文件*是否来自/proc

在做了一个fstat之后查看stat的内容,我看不出有任何明确的方法可以检测到这一点。在st_模式下,或者所有权或权限都不能确定地告诉我它来自/proc

设备id看起来很有希望——在我尝试过的系统上,它返回为3,其中常规磁盘的数字更高,如801。但它总是保证为3吗?我找不到官方支持的方式

在c/c++中查找答案已找到“确定”答案

#include <sys/statfs.h>
#include <linux/magic.h>

struct statfs fs;
fstatfs( fileno( file ), &fs );
bool isProc = ( fs.f_type == PROC_SUPER_MAGIC ) ? true : false;

更改逻辑,使代码可以使用管道。那就别管了。为什么你的代码需要知道文件的大小?这是一个明显的问题。你从FDs上读错了。您不需要文件大小。流或管道中不存在文件大小。删除该约束,您就完成了。@Rafaelbatista因此,一个简单的解决方法是:如果文件大小为零,则假定该文件是一个可能包含内容的特殊文件,然后进入该代码。如果它真的是空的,那么不管怎样,你都会得到一个空的缓冲区。否则,如果文件大小为非零,则采用预分配缓冲区的优化路径。/proc文件不是唯一以这种方式运行的文件-例如,还有/sys文件。普通文件也可以在调用fstat和读取fstat之间更改大小。