Ho un driver di periferica di carattere Linux che crea una voce /dev/mything
e quindi un programma C++/Qt che apre il dispositivo e lo utilizza. Se il programma viene chiuso correttamente, con exit()
, il dispositivo viene chiuso e il driver si reimposta correttamente. Ma se il programma esce in modo anomalo, tramite segfault o SIGINT
o qualcosa del genere, il dispositivo non viene chiuso correttamente.Come può rilevare un driver di dispositivo di carattere Linux quando un programma che lo utilizza esce in modo anomalo?
mia soluzione attuale è quella di ricaricare il driver se si blocca nello stato "aperto".
Questa linea nel driver cerca di impedire più programmi di utilizzare il dispositivo contemporaneamente:
int mything_open(struct inode* inode, struct file* filp) {
...
if (port->rings[bufcount].virt_addr) return -EBUSY;
...
}
Allora questo pulisce in su:
int mything_release(struct inode* inode, struct file* filp) {
...
port->rings[bufcount].virt_addr = NULL;
...
}
Penso exit()
sta causando mything_release
di essere chiamato, ma SIGINT
non è. Come posso rendere il conducente più robusto in questo tipo di situazione?
EDIT:
Qui ci sono le operazioni che ho implementato. Forse mi manca qualcosa?
static struct file_operations fatpipe_fops = {
.owner = THIS_MODULE,
.open = mything_open,
.release = mything_release,
.read = mything_read,
.write = mything_write,
.ioctl = mything_ioctl
};
Quando il processo termina o termina, il kernel libererà le risorse. Compreso il conteggio dei riferimenti su qualsiasi descrittore di file aperto. – wildplasser
In questo caso, perché dopo che il mio programma termina con SIGINT/segfault, quando si tenta di riaprire il programma viene visualizzato 'Dispositivo o risorsa occupata? Non vedo questo errore se esco pulito e riaprilo. – Dave
Non conosco il tuo codice. Forse hai un valore sbagliato per il bufcount? Forse non hai implementato una delle funzioni necessarie? – wildplasser