2011-12-27 23 views
5

Tôi đang cố gắng viết một mô-đun hạt nhân ghi một số dữ liệu vào một tập tin proc. Tôi đang cố gắng viết một cái gì đó như 5000 ký tự nhưng khi tôi nói $> cat/proc/myentry tôi có thể đọc chỉ 1000 ký tự.Làm cách nào để đọc dữ liệu lớn từ tệp 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; 
} 

Đây là mã của tôi. Cảm ơn trước.

Trả lời

2

Tôi đã có chính xác vấn đề này.

Một vấn đề trong bài đăng gốc, if (offset>0) được sử dụng nhiều lần trong các ví dụ về tệp proc nhỏ. Đọc được gọi nhiều lần cho đến khi chúng tôi trả về 0 để cho biết rằng không có thêm dữ liệu. Vì vậy, các if (offset>0) có nghĩa là chúng tôi trở lại (chiều dài của bộ đệm) là 0.

Có 3 cách để trả về dữ liệu với hàm này. Nhìn vào các ý kiến ​​mã nguồn, line 75 onwards:

Đối với các file lớn (phương pháp 2 từ bình luận), tôi đã làm như sau: -

  • Đối với mỗi lần dữ liệu lớn của bạn, sao chép 'buffer_length' dữ liệu để 'đệm'.
  • Đặt '* bắt đầu' (hoặc trong trường hợp của bạn * buffer_location) thành 'buffer'.
  • trả lại số lượng dữ liệu bạn đã viết (thường là 'buffer_length')

Cuối cùng, tất cả dữ liệu sẽ được ghi và bạn quay trở lại 0.

này làm việc cho tôi với một số Meg dữ liệu.

3

Tôi không phải là một chuyên gia về hạt nhân, nhưng trong linux-3.1.6/fs/proc/task_mmu.c tôi thấy một số mã như

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" 

vì vậy đây gợi ý rằng bạn có thể muốn sử dụng seq_printf không sprintf .... Các m là một con trỏ struct seq_file *.

Theo nguyên tắc chung, bạn sẽ học được rất nhiều bằng cách nghiên cứu mã nguồn phần mềm miễn phí mà bạn đang mở rộng. Trong trường hợp của bạn, đó là Linux kernel source code

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