2013-10-26 4 views
3

Я реализую драйвер персонажа. Поэтому я регистрирую файловые операции. Когда я регистрация read функции я извлеченный minor номер этого путемПочему открытый вызов принимает два аргумента (struct inode *, struct file *)?

 myread(struct file * file, char __user * ubuf, size_t lbuf, loff_t *offset) 
    { 
     int minor; 

     minor = MINOR(file->f_path.dentry->d_inode->f_pos->i_rdev); 
     ....... 

Это правило будет применяться к open вызову тоже.

 myopen(struct inode * inode, struct file * file) 

struct file определение иметь ссылку на struct inode. Поэтому достаточно одного аргумента для вызова open.

Мои вопросы:

  1. Почему open есть два аргумента? (или) почему read не имеет struct inode * аргумент?
  2. Чтобы извлечь второстепенное число в read звонок, я использовал выше инструкцию. Чтобы найти определения и заголовочные файлы, мне понадобилось 1 час 30 минут. Есть ли простой способ найти определения структур?
  3. Сколько способов мы можем найти ссылку struct inode через struct file и что является лучшим способом?
+0

Потому что соглашения ядра таковы. Для их изменения требуется много переписывания кода. –

ответ

4

Вы не должны использовать эту конструкцию для поиска inode; файл или даже каталог могут быть удалены после того, как файл был открыт.

Ядро конвенции (см главу 3 Linux Device Drivers) является то, что

  1. в вашей open функции, вы смотрите свои собственные данные из индексного дескриптора (или выделить свои собственные данные) и установите file->private_data указатель ; и

  2. в вашей функции read, вы затем используете file->private_data, чтобы получить доступ к своим собственным материалам.

Смежные вопросы