Next: La estructura file.
Up: Un módulo algo más
Previous: Asignación dinámica de números
  Índice General
  Índice de Materias
Operaciones sobre el dispositivo, file_operations.
Cuando queremos actuar sobre un dispositivo, estaremos ejecutando las funciones
(file_operations) de su driver asociado. La estructura
file_operations
es una tabla
de punteros a funciones que tendremos que rellenar con punteros a las funciones
implementadas por nuestro módulo.
Presentamos aquí, por conveniencia, la estructura file_operations según está
definida en linux/fs.h:
struct file_operations {
loff_t (*llseek) (struct file *, loff_t, int);
ssize_t (*read) (struct file *, char *, size_t, loff_t *);
ssize_t (*write) (struct file *, const char *, size_t, loff_t *);
int (*readdir) (struct file *, void *, filldir_t);
unsigned int (*poll) (struct file *, struct poll_table_struct *);
int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);
int (*mmap) (struct file *, struct vm_area_struct *);
int (*open) (struct inode *, struct file *);
int (*flush) (struct file *);
int (*release) (struct inode *, struct file *);
int (*fsync) (struct file *, struct dentry *);
int (*fasync) (int, struct file *, int);
int (*check_media_change) (kdev_t dev);
int (*revalidate) (kdev_t dev);
int (*lock) (struct file *, int, struct file_lock *);
};
-
llseek
: Se usa para cambiar la posición actual de lectura-escritura
sobre el fichero. La nueva posición se retorna en forma de un entero positivo,
si el valor retornado es negativo, es que se ha producido algún error. El
objeto de esta función es por tanto modificar la estructura
file4.12 del fichero del dispositivo para que refleje la nueva
posición de lectura-escritura.
-
read
: Se usa para extraer datos desde el dispositivo. Si se apunta
a
null
, cualquier lectura sobre el dispositivo dará un
-EINVAL
. Un resultado positivo informa de la cantidad de datos leídos.
-
write
: Manda datos al dispositivo. Se hacen las mismas
consideraciones que para read.
-
readdir
: Debe apuntar a
null
, solo se usa para directorios,
no para dispositivos.
-
poll
: Para dejar en espera al proceso llamante, no la usaremos.
-
ioctl
: Es la función
comodín
, implementa todas aquellas
cosas para las que no hay una función específica, Estas funcionalidades
adicionales pueden depender del dispositivo, y pueden ser muchas, los
argumentos numéricos a (*ioctl) sirven para elegir entre las posibles opciones
y para el paso de argumentos.
-
mmap
: mapea la memoria del dispositivo a memoria del proceso
llamante, útil para DMA, si no se implementa retorna
-EINVAL
-
open
: Es la primera operación que se realiza sobre el fichero del
dispositivo, será la encargada de las inicializaciones.
-
flush
: No la usaremos.
-
release
: Esta operación se invoca cuando el fichero deja de
utilizarse. Algo así como el contrario de open.
-
fsync
: No la usaremos.
-
fasync
: No la usaremos.
-
check_media_change
: Solo se usa con dispositivos de bloque,
especialmente para dispositivos con medio extraíble, como la disquetera. Se usa
para ver si se cambió el medio desde la última operación. No la usaremos.
-
revalidate
: Solo para dispositivos de bloque, está relacionada con
el manejo de la cache de buffers. No la usaremos.
-
lock
: Para bloquear accesos, no la usaremos.
Next: La estructura file.
Up: Un módulo algo más
Previous: Asignación dinámica de números
  Índice General
  Índice de Materias
Alberto Cortés
2001-03-26