2011-12-27 12 views
5

मैं एक कर्नेल मॉड्यूल लिखने की कोशिश कर रहा हूं जो एक प्रो फ़ाइल में कुछ डेटा लिखता है। मैं 5000 वर्णों की तरह कुछ लिखने की कोशिश कर रहा हूं लेकिन जब मैं $> बिल्ली/proc/myentry कहता हूं तो मैं केवल 1000 वर्ण पढ़ सकता हूं।मैं proc फ़ाइल से बड़े डेटा को कैसे पढ़ सकता हूं?

int procfile_read(char *buffer, char **buffer_location, off_t offset, int buffer_length, int *eof, void *data){ 
int ret; 
static char my_buffer[4096]; 

if (offset > 0) { 

    ret = 0; 
} else { 

    ret = sprintf(my_buffer, LARGE STRING HERE); 
} 

*buffer_location=my_buffer; 
return ret; 
} 

यह मेरा कोड है। अग्रिम में धन्यवाद।

उत्तर

2

मुझे वास्तव में यह समस्या थी।

मूल पोस्ट में एक मुद्दा, if (offset>0) छोटी प्रो फाइलों के उदाहरणों में कई बार उपयोग किया जाता है। पढ़ने को कई बार कहा जाता है जब तक हम यह इंगित करने के लिए 0 नहीं लौटाते कि कोई और डेटा नहीं है। तो if (offset>0) का अर्थ है कि हम 0 (

इस फ़ंक्शन के साथ डेटा वापस करने के 3 तरीके हैं।

  • अपने बड़े डेटा के प्रत्येक गांठ के लिए, प्रतिलिपि करने के लिए डेटा की 'buffer_length' -: स्रोत कोड टिप्पणियों को देखो, line 75 onwards:

    बड़ी फ़ाइलों (टिप्पणी से विधि 2) के लिए, मैं निम्नलिखित किया 'बफ़र'।

  • 'bufer' पर '* start' (या अपने मामले में * buffer_location) सेट करें।
  • डेटा की मात्रा (आमतौर पर 'buffer_length') ने लिखा है

अंत में, सभी डेटा लिखा जाएगा वापसी और 0.

लौट इस डेटा के कई मेग के साथ मेरे लिए काम किया।

3

मैं एक कर्नेल विशेषज्ञ नहीं हूँ, लेकिन linux-3.1.6/fs/proc/task_mmu.c में मैं देख रहा हूँ की तरह

seq_printf(m, 
      "VmPeak:\t%8lu kB\n" 
      "VmSize:\t%8lu kB\n" 
      "VmLck:\t%8lu kB\n" 
      "VmHWM:\t%8lu kB\n" 
      "VmRSS:\t%8lu kB\n" 
      "VmData:\t%8lu kB\n" 
      "VmStk:\t%8lu kB\n" 

कुछ कोड तो यह पता चलता है कि आप seq_printf नहीं sprintf उपयोग करने के लिए चाहते हो सकता है .... m एक struct seq_file * सूचक है।

एक सामान्य नियम के रूप में, आप मुफ्त सॉफ्टवेयर स्रोत कोड का अध्ययन करके बहुत कुछ सीखेंगे जो आप विस्तार कर रहे हैं। आपके मामले में, यह लिनक्स kernel source code

संबंधित मुद्दे