2012-01-24 4 views
8

私は、/ procにあるテキストファイル以外のテキストファイルを読むことができるプログラムを書くことができました。/procから読み込もうとしたファイルは空になります。私のCコードが/ 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; 
} 

答えて

13

/procのファイルは、カーネルによってオンザフライで生成されるため、0バイトのサイズです。

procファイルシステムの詳細については、こちらを参照してください:

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

+4

正しいファイル読み取りループを使用しないことにより、別の誤ったユーザーが噛まれました。 –

+0

ユーザーは誤ったファイル読み取りループではなく、エラーのチェックに失敗して焼き付けられました。 –

+1

通常、ファイル全体をロードする場合は、高価な再アロケーションを避けるために、まず適切な量のメモリを割り当てることが理にかなっています。/procはこの意味でちょうど壊れています。/proc内のファイルが通常のファイルとして動作するのではなくパイプとして動作する場合、通常のファイルセマンティクスを破るのではなく、fifoやstatによって検出可能なその他の特殊ファイルタイプとして表示されるはずです... –

1

ファイルのサイズを知りたい場合は、STATを(2)移動するための方法です。しかし、何をしているのか、それをfopen()したあとfread()するか、realloc(3)について学び、それを使って非常に大きなバッファ(RAMは安く、これはワンショットプログラムです)あなたのファイル読み取りループ。 ouahが言ったように、/ procのファイルは特別です。

calloc()は返された割り当て領域の0番目の文字を '\ 0'に設定すると、空の文字列にするには十分であるため、cpuサイクルの無駄です。その最初のバイトに続くデータの

+3

しかしAFAIK 'stat 2)ほとんどの '/ proc /'テキストファイルでは動作しません。あなたはEOFまで 'read(2)'しなければなりません。 –

+0

"@ouahが言ったように、/ procのファイルは特別です。" (したがって、いくつかの点では機能しません)。以下に示唆しているように、通常のファイル読み取りループを使用するのが正しい方法です。 –

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); 

シークのように、古典的なループによって順次読み出されることが意図されています。パイプのようなビット。

+1

while引数にfeof()を使用することは悪い習慣です。これを見てください:http://www.drpaulcarter.com/cs/common-c-errors.php#4.2 – pmont