2012-01-24 37 views
8

Tôi đã có thể viết một chương trình có thể đọc bất kỳ tệp văn bản nào ... ngoại trừ những tệp được tìm thấy trong/proc. Bất kỳ tập tin nào mà tôi cố đọc từ/proc đều trống.Bất kỳ ý tưởng nào Tại sao mã C của tôi không thể đọc từ/proc?

Nhưng bất cứ khi nào tôi gõ

cat /proc/cpuinfo 

trên thiết bị đầu cuối, tôi đã trình bày với thông tin CPU của tôi.

Tôi cũng có thể xem tệp khi tôi mở tệp bằng trình chỉnh sửa văn bản, chẳng hạn như gedit hoặc leafpad.

Vì vậy, dường như tệp/proc thực sự là tệp văn bản, nhưng chương trình C của tôi đang gặp khó khăn khi đọc chúng.

#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; 
} 

Bất kỳ ý tưởng nào tại sao?

Trả lời

13

Các tệp từ /proc có kích thước 0 byte vì chúng được tạo ra ngay lập tức bởi hạt nhân.

Xem ở đây để biết thêm thông tin về hệ thống tập tin proc:

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

+4

Một người dùng không thích khác bị cắn bởi không sử dụng đúng vòng lặp đọc tệp. –

+0

Người dùng đã bị đốt cháy không phải bởi một vòng lặp đọc tệp không chính xác, nhưng bằng cách không kiểm tra lỗi. –

+1

Thông thường nếu bạn muốn tải toàn bộ tệp, bạn nên phân bổ số lượng bộ nhớ phù hợp trước để tránh các tệp reallocs đắt tiền./proc chỉ bị phá vỡ theo nghĩa này. Nếu các tập tin trong/proc sẽ không hoạt động như các tập tin bình thường mà là các đường ống, chúng sẽ hiển thị như năm mươi hoặc một số loại tập tin đặc biệt khác có thể phát hiện được bằng stat, thay vì phá vỡ các ngữ nghĩa tập tin thông thường ... –

1

Nếu bạn muốn biết kích thước của một tập tin, stat (2) là con đường để đi. Nhưng đối với những gì bạn đang làm, hoặc phân bổ một bộ đệm rất lớn (RAM là rẻ và đây là một chương trình một-shot) bạn fread() vào sau khi bạn fopen() nó, hoặc tìm hiểu về realloc (3) và sử dụng nó trong vòng lặp đọc tệp của bạn. Như ouah đã nói, các tập tin trong/proc là đặc biệt.

Để sử dụng cho mục đích chung, và đặc biệt là cho chuỗi, calloc() là một sự lãng phí chu kỳ CPU, khi đặt giá trị 0 của vùng phân bổ trả về thành '\ 0' là đủ để biến nó thành chuỗi rỗng, bất kể của dữ liệu theo sau byte đầu tiên đó.

+3

Nhưng AFAIK 'stat (2) 'không làm việc cho hầu hết'/proc/'tập tin văn bản. Bạn phải 'đọc (2)' cho đến EOF. –

+0

"Như @ouah đã nói, các tệp trong/proc là đặc biệt." (Và do đó sẽ không hoạt động theo một số cách.) Sử dụng vòng lặp đọc tệp thông thường như bạn đã đề xuất bên dưới là cách đúng để đọc chúng. –

6

Hầu hết /proc/ file văn bản nhằm mục đích để được đọc tuần tự bởi một vòng cổ điển như

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

tìm kiếm không làm việc với chúng. Một chút giống như cho đường ống.

+1

Thực hành xấu để sử dụng feof() trong đối số trong khi. Xem thông tin này: http://www.drpaulcarter.com/cs/common-c-errors.php#4.2 – pmont

Các vấn đề liên quan