簡體   English   中英

Linux字符設備驅動程序如何檢測使用它的程序何時異常退出?

[英]How can a Linux character device driver detect when a program using it exits abnormally?

我有一個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完全相同),而是在設備的狀態保持方面存在問題。 換句話說,如果在程序崩潰的確切位置插入close(dev_fd)或甚至exit(0) ,則會遇到同樣的問題。

您應該弄清楚您的驅動程序行為的哪個部分導致它保持繁忙狀態並修復它。

問題歸結為mything_release這一行,等待一些內存寫入完成:

if (wait_event_interruptible_timeout(port->inq, false, 10)) return -ERESTARTSYS;

通過正常的程序退出,這將旋轉10個jiffies並繼續。 但是由於SIGINT或其他東西的異常退出,我認為可中斷的超時被中斷並返回-ERESTARTSYS ,導致我的if返回相同的內容。

對我有用的事情就是擺脫if和等待:

wait_event_interruptible_timeout(port->inq, false, 10);

多年前這個補丁使我相信從關閉/ _release函數返回ERESTARTSYS並不是一個好主意: http ://us.generation-nt.com/answer/patch-fix-wrong-error-code-interrupted-close -syscalls的幫助,181191441.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM