我有一个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
};
最佳答案
没有必要进行这项测试;问题不在于程序终止异常(从驾驶员的角度来看,这与设备上的正常关闭完全相同),而是在设备的状态保持方面存在问题.换句话说,如果在程序崩溃的确切位置插入close(dev_fd)或甚至exit(0),则会遇到同样的问题.
您应该弄清楚您的驱动程序行为的哪个部分导致它保持繁忙状态并修复它.