/dev/mything
エントリを作成するLinuxキャラクタデバイスドライバ、次にデバイスを開いて使用するC++/Qtプログラムがあります。そのプログラムが正しく終了すると、exit()
、デバイスが閉じられ、ドライバが正しくリセットされます。しかし、プログラムがsegfaultまたはSIGINT
などで異常終了すると、デバイスが正しく閉じられません。Linuxのキャラクタデバイスドライバは、それを使用するプログラムが異常終了すると、どのように検出できますか?
私の現在の回避策は、ドライバが「オープン」状態になってもリロードすることです。ドライバで
この行が同時にデバイスを使用して複数のプログラムを防ぐためにしようとします:
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
ていると思いますそうではありません。このような状況に対して、ドライバをより堅牢にするにはどうすればよいですか?
EDIT:
は、ここで私が実装した操作です。多分私は何かを欠いているでしょうか?
static struct file_operations fatpipe_fops = {
.owner = THIS_MODULE,
.open = mything_open,
.release = mything_release,
.read = mything_read,
.write = mything_write,
.ioctl = mything_ioctl
};
処理が終了するか終了すると、カーネルはリソースを解放します。開いているファイル記述子に参照カウントを含める。 – wildplasser
そのような場合、私のプログラムがSIGINT/segfaultで終了した後に、プログラムを再オープンしようとすると、 'Device or resource busy'が発生するのはなぜですか?私はそれをきれいに終了して、それを再び開くと、私はそのエラーは表示されません。 – Dave
あなたのコードは分かりません。 bufcountに間違った価値があるかもしれませんか?必要な機能の1つを実装していない可能性がありますか? – wildplasser