微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

您应该弄清楚您的驱动程序行为的哪个部分导致它保持繁忙状态并修复它.

原文地址:https://www.jb51.cc/linux/440366.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐