【问题标题】:Any Idea Why My C Code Can't Read from /proc?知道为什么我的 C 代码无法从 /proc 读取吗?
【发布时间】:2012-01-24 18:56:49
【问题描述】:

我已经能够编写一个可以读取任何文本文件的程序...除了 /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;
}

知道为什么吗?

【问题讨论】:

    标签: c linux unix


    【解决方案1】:

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

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

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

    【讨论】:

    • 另一个错误的用户因未使用正确的文件读取循环而被咬。
    • 用户被烧毁的不是错误的文件读取循环,而是未能检查错误。
    • 通常如果你想加载整个文件,首先分配适量的内存以避免昂贵的重新分配是有意义的。 /proc 在这个意义上只是被破坏了。如果 /proc 中的文件不是普通文件而是管道,它们应该显示为 fifos 或 stat 可检测到的其他特殊文件类型,而不是破坏普通文件语义...
    【解决方案2】:

    大多数/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);
    

    寻求对他们不起作用。有点像管道。

    【讨论】:

    【解决方案3】:

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

    对于一般用途,尤其是对于字符串,calloc() 会浪费 CPU 周期,因为将返回的分配区域的第 0 个字符设置为 '\0' 足以使其成为空字符串,而不管第一个字节之后的数据。

    【讨论】:

    • 但是 AFAIK stat(2) 不适用于大多数 /proc/ 文本文件。您必须 read(2) 直到 EOF。
    • “正如@ouah 所说,/proc 中的文件很特殊。” (因此在某些方面不起作用。)按照您在下面的建议使用正常的文件读取循环是读取它们的正确方法。
    猜你喜欢
    • 2014-04-02
    • 2020-06-12
    • 2023-03-29
    • 2017-10-29
    • 1970-01-01
    • 2020-02-16
    • 2017-04-01
    • 2021-08-18
    • 1970-01-01
    相关资源
    最近更新 更多