Estoy estudiando el capítulo 3.5 de Linux Device Drivers, 3rd edition. En esta sección se presenta un método para recuperar una estructura a medida que definimos a nosotros mismos de struct inode *inode
en la función de apertura:Motivo para pasar datos utilizando struct inode y struct file en la programación del controlador del dispositivo Linux
int scull_open(struct inode *inode, struct file *filp)
{
struct scull_dev *dev;
dev = container_of(inode->i_cdev, struct scull_dev, cdev);
filp->private_data = dev; /* for other methods */
}
return 0;
}
Desde mi entender, mientras que el dispositivo se abre, el struct inode *inode
que representa el dispositivo se pasa a scull_open
. A continuación, la estructura de encargo dev
se extrae y se pasa a filp->private_data
de modo que otros métodos como scull_read
puede usarlo:
ssize_t scull_read(struct file *filp, char _ _user *buf, size_t count,
loff_t *f_pos)
{
struct scull_dev *dev = filp->private_data;
/* other codes that uses *dev */
}
Esto parece ir bien hasta que me di cuenta de que ya teníamos un struct scull_dev *dev
durante la inicialización en scull_setup_cdev
here.
estoy bastante confusa ya que pensamos que podemos hacer struct scull_dev *dev
una variable global, entonces scull_read
y otros métodos con el tiempo a tener acceso a ella sin pasar por todo el paso utilizando inode
y file
.
Mi pregunta es, ¿por qué no la convertimos en una variable global?
¿Alguien puede proporcionar algunos ejemplos prácticos del uso de este método para pasar datos?
Que esta pregunta/respuesta sea una lección para usted en qué variables globales son malas y nunca debe ser usado excepto cuando no hay otra manera. –
Sí, pero mientras enseña al escritor debe decir por qué y para qué sirve esa función en particular. – mrigendra