我有一个创建/dev/mything
条目的 Linux 字符设备驱动程序,然后是一个打开设备并使用它的 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
};