У меня есть драйвер символьного устройства Linux, который создает запись /dev/mything
, а затем программа C++/Qt, которая открывает устройство и использует его. Если эта программа завершается правильно, с помощью exit()
устройство закрывается, а драйвер корректно перезагружается. Но если программа аварийно завершает работу из-за segfault или SIGINT
или чего-то еще, устройство не закрывается должным образом.
В настоящее время я перезагружаю драйвер, если он зависает в открытом состоянии.
Эта строка в драйвере пытается предотвратить одновременное использование устройства несколькими программами:
int mything_open( struct inode* inode, struct file* filp ) {
...
if ( port->rings[bufcount].virt_addr ) return -EBUSY;
...
}
Затем это очищает его:
int mything_release( struct inode* inode, struct file* filp ) {
...
port->rings[bufcount].virt_addr = NULL;
...
}
Я думаю, что exit()
вызывает mything_release
для вызова, но SIGINT
нет. Как я могу сделать драйвер более устойчивым к такой ситуации?
РЕДАКТИРОВАТЬ:
Вот операции, которые я реализовал. Может я что-то упускаю?
static struct file_operations fatpipe_fops = {
.owner = THIS_MODULE,
.open = mything_open,
.release = mything_release,
.read = mything_read,
.write = mything_write,
.ioctl = mything_ioctl
};