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

时间:2012-01-24 18:56:49

标签: c linux unix

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

但每当我输入

cat /proc/cpuinfo

在终端上,我看到了我的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;
}

知道为什么吗?

3 个答案:

答案 0 :(得分:13)

来自/proc的文件大小为0字节,因为它们是由内核动态生成的。

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

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

答案 1 :(得分: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);
寻求不对他们工作。有点像管道。

答案 2 :(得分:1)

如果你想知道文件的大小,stat(2)就是你要走的路。但是对于你正在做的事情,要么分配一个非常大的缓冲区(RAM很便宜,这是一次性程序)你fope()之后你fopen()它,或者了解realloc(3)并使用它你的文件阅读循环。正如ouah所说,/ proc中的文件是特殊的。

对于通用用途,特别是对于字符串,calloc()浪费了cpu周期,因为将返回的分配区域的第0个字符设置为'\ 0'足以使它成为空字符串,无论第一个字节后的数据。