C - 通过shell(cat)或通过程序(fread)读取proc文件之间的区别



我有一个kernel moduleproc-fs中创建一个条目和一个读取文件的userspace-program
我的proc read-function看起来像:

typedef struct {
  int integer;
  unsigned long ulong;
  char string[100];
  float floatt;
  bool booll;
  u16 crc;
} struktur;
static int round = 0, len = 0, temp = 0, err;
struktur *pde_data_p;
int proc_read(struct file *filp, char *buf, size_t count, loff_t *offp) {
  int i;
  unsigned char *crcbuf;
  struktur struct_buf;
  pde_data_p = PDE_DATA(file_inode(filp));
  crcbuf = (unsigned char*)pde_data_p;
  memcpy(&struct_buf, pde_data_p, sizeof(struktur));
  if (pde_data_p == NULL) {
    printk(KERN_ERR "pde->data == NULLn");
    round = 0;
    return 0;
  }
  if (round == 0)
    temp = sizeof(struktur);
  if (count > temp)
    count = temp;
  struct_buf.crc = crc16(struct_buf.crc, crcbuf, sizeof(struktur)-sizeof(unsigned short));
  err = copy_to_user(buf, pde_data_p, count);
  //if (err == 0) {    // copy_to_user finished
    round = 0;
    temp = 0;        // taking this line out makes it work in the prog but not with my cat
    return temp;
  //} else {           // copy_to_user failed -> return number of bytes that have not been copied
    //temp = err;
    //round++;
    //return temp;
  //}
}

program code是:

typedef struct {
  int integer;
  unsigned long ulong;
  char string[100];
  float floatt;
  bool booll;
  unsigned short crc;
} struktur;
int main(void) {
  int i;
  struktur str_inp;
  unsigned short crc = 0;
  unsigned char *str_p = (unsigned char*)&str_inp;

  FILE *fp = fopen("/proc/sen/entry", "r");
  fread(&str_inp, 1, sizeof(struktur), fp);
  fclose(fp);
}

如您所见,我的 proc read-函数返回读取的字节数,而不是零。
这样我的程序工作正常,但是当我尝试通过 cat (cat/proc/sen/entry ( 读取时,它永远不会完成,因为它永远不会返回 0。
当我在copy_to_user完成后更改代码并return 0时,通过cat读取工作正常,但我的程序似乎读取随机内存。当我返回复制字节数的一半时,用户空间程序读取的数据中只有一半是正确的。

proc_read函数必须返回的内容取决于在*offp中移交的位置。如果只需要用于给定的用户空间程序代码和cat(而不是部分读取struktur(,则

足以
    if (*offp) return 0;            // no more data to return
    else *offp = sizeof (struktur); // file position after data returned

- 这句话在copy_to_user()之前.

最新更新