2012-01-24 64 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中的文件不像普通文件那樣行爲,而是作爲管道,它們應該顯示爲fifos或stat可檢測到的其他特殊文件類型,而不是破壞普通文件的語義... –

1

如果你想知道一個文件的大小,統計(2)是要走的路。但是對於你正在做的事情,要麼分配一個非常大的緩衝區(RAM很便宜,這是一個一次性程序),你在fopen()之後fread(),或者學習realloc(3),並使用它你的文件讀取循環。正如ouah所說,/ proc中的文件是特殊的。

對於一般用途,特別是對於字符串,calloc()浪費了cpu週期,因爲將返回的分配區域的第0個字符設置爲'\ 0'足以使其成爲空字符串,無論的第一個字節之後的數據。

+3

但是AFAIK'stat( 2)''不適用於大多數'/ proc /'文本文件。你必須閱讀(2)'直到EOF。 –

+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

相關問題