任何想法为什么我的C代码无法从/ proc读取?

Sal*_*Sal 8 c unix linux

我已经能够编写一个程序,可以读取任何文本文件...除了在/ proc中找到的文件.我尝试从/ proc读取的任何文件都显示为空.

但每当我打字

cat /proc/cpuinfo
Run Code Online (Sandbox Code Playgroud)

在终端上,我看到了我的CPU信息.

当我用文本编辑器(例如gedit或leafpad)打开它时,我也可以看到该文件.

所以似乎/ proc文件确实是文本文件,但我的C程序很难读取它们.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

char* readFileString( char* loc ) {
        char *fileDat;
        FILE * pFile;
        long lsize;

        pFile = fopen( loc, "r" );

        // Grab the file size.
        fseek(pFile, 0L, SEEK_END);
        lsize = ftell( pFile );
        fseek(pFile, 0L, SEEK_SET);

        fileDat = calloc( lsize + 1, sizeof(char) );

        fread( fileDat, 1, lsize, pFile );

        return fileDat;
}

int main( void ) {
        char *cpuInfo;

        cpuInfo = readFileString( "/proc/cpuinfo" );

        printf( "%s\n", cpuInfo );

        return 0;
}
Run Code Online (Sandbox Code Playgroud)

知道为什么吗?

oua*_*uah 13

这些文件/proc的大小为0字节,因为它们是由内核动态生成的.

有关proc文件系统的更多信息,请参见此处:

http://tldp.org/LDP/Linux-Filesystem-Hierarchy/html/proc.html

  • 另一个错误的用户因未使用正确的文件读取循环而被咬. (4认同)

Bas*_*tch 6

大多数/proc/文本文件旨在通过类似的经典循环顺序读取

FILE *f = fopen("/proc/cpuinfo", "r");
size_t sz = 0;
char * lin = 0;
do {
   ssize_t lsz = getline (&lin, &sz, f);
   if (lsz<0) break;
   handle_line_of_size (lin, lsz);
} while (!feof (f));
fclose (f);
Run Code Online (Sandbox Code Playgroud)

寻求不对他们工作.有点像管道.