Любая идея, почему мой код C не может прочитать из / proc? - PullRequest
8 голосов
/ 24 января 2012

Мне удалось написать программу, которая может читать любые текстовые файлы ... кроме найденных в / proc. Любой файл, который я пытаюсь прочитать из / proc, отображается пустым.

Но всякий раз, когда я печатаю

cat /proc/cpuinfo

на терминале, мне сообщают информацию о моем процессоре.

Я также вижу файл, когда открываю его в текстовом редакторе, таком как 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 ]

13 голосов
/ 24 января 2012

Файлы из /proc имеют размер 0 байт, потому что они генерируются ядром на лету.

Смотрите здесь для получения дополнительной информации о файловой системе proc:

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

6 голосов
/ 24 января 2012

Большинство /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);

, при котором поиск не работает с ними.Немного похоже на трубы.

1 голос
/ 24 января 2012

Если вы хотите узнать размер файла, вам нужно использовать stat (2).Но для того, что вы делаете, либо выделите очень большой буфер (ОЗУ дешевая, и это программа с одним выстрелом), в которую вы вникнули () после fopen (), либо изучите realloc (3) и используйте его вваш цикл чтения файлов.Как уже говорилось, файлы в / proc являются специальными.

Для общего назначения, особенно для строк, calloc () - пустая трата циклов процессора, так как установка 0-го символа возвращаемой области выделения на '\ 0' достаточна, чтобы сделать ее пустой строкойнезависимо от данных, следующих за первым байтом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...