Как драйвер символьного устройства Linux может определить аварийное завершение работы использующей его программы?

У меня есть драйвер символьного устройства 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
};
6
задан Dave Ceddia 25 June 2012 в 14:55
поделиться