Tengo un controlador de dispositivo de caracteres de Linux que crea una entrada /dev/mything
, y luego un programa C++/Qt que abre el dispositivo y lo usa. Si ese programa sale correctamente, con exit()
, el dispositivo se cierra y el controlador se reinicia correctamente. Pero si el programa se cierra de manera anormal, a través de segfault o SIGINT
o algo así, el dispositivo no se cierra correctamente.¿Cómo puede detectar un controlador de dispositivo de caracteres Linux cuando un programa que lo usa sale anormalmente?
Mi solución actual es volver a cargar el controlador si se queda atascado en el estado "abierto".
Esta línea en el controlador intenta evitar que varios programas de utilizar el dispositivo de forma simultánea:
int mything_open(struct inode* inode, struct file* filp) {
...
if (port->rings[bufcount].virt_addr) return -EBUSY;
...
}
Entonces esto lo limpia:
int mything_release(struct inode* inode, struct file* filp) {
...
port->rings[bufcount].virt_addr = NULL;
...
}
creo exit()
está causando mything_release
ser llamado, pero SIGINT
no es. ¿Cómo puedo hacer que el controlador sea más robusto para este tipo de situación?
EDIT:
Estas son las operaciones que han puesto en práctica. Tal vez me estoy perdiendo algo?
static struct file_operations fatpipe_fops = {
.owner = THIS_MODULE,
.open = mything_open,
.release = mything_release,
.read = mything_read,
.write = mything_write,
.ioctl = mything_ioctl
};
Cuando el proceso finaliza o finaliza, el kernel liberará los recursos. Incluyendo la cuenta de referencia en cualquier descriptor de archivo abierto. – wildplasser
Si ese es el caso, ¿por qué después de que mi programa termina con SIGINT/segfault, obtengo 'Device or resource busy' cuando intento reabrir el programa? No veo ese error si lo salgo limpiamente y lo vuelvo a abrir. – Dave
No sé tu código. ¿Tal vez tienes el valor incorrecto para el bufcount? Tal vez no has implementado una de las funciones necesarias? – wildplasser