Ich habe einen Linux-Zeichen Gerätetreiber, der einen /dev/mything
Eintrag erstellt, und dann ein C++/Qt-Programm, das das Gerät öffnet und es verwendet. Wenn das Programm ordnungsgemäß beendet wird, wird das Gerät mit exit()
geschlossen und der Treiber wird ordnungsgemäß zurückgesetzt. Aber wenn das Programm abnormal beendet wird, über segfault oder SIGINT
oder etwas, wird das Gerät nicht richtig geschlossen.Wie kann ein Linux-Zeichengerätetreiber erkennen, wenn ein Programm, das es verwendet, abnormal beendet wird?
Meine aktuelle Problemumgehung besteht darin, den Treiber neu zu laden, wenn es im Status "offen" stecken bleibt.
Diese Zeile in der Fahrer versucht, mehrere Programme gleichzeitig mit dem Gerät zu verhindern:
int mything_open(struct inode* inode, struct file* filp) {
...
if (port->rings[bufcount].virt_addr) return -EBUSY;
...
}
Dann ist dieses reinigt es auf:
int mything_release(struct inode* inode, struct file* filp) {
...
port->rings[bufcount].virt_addr = NULL;
...
}
Ich denke, exit()
mything_release
aufgerufen werden, verursacht aber SIGINT
ist nicht. Wie kann ich den Fahrer für solche Situationen robuster machen?
EDIT:
Hier sind die Operationen, die ich umgesetzt haben. Vielleicht vermisse ich etwas?
static struct file_operations fatpipe_fops = {
.owner = THIS_MODULE,
.open = mything_open,
.release = mything_release,
.read = mything_read,
.write = mything_write,
.ioctl = mything_ioctl
};
Wenn der Prozess beendet wird oder beendet wird, wird der Kernel die Ressourcen freigeben. Einbeziehen der Referenzzählung in alle offenen Dateideskriptoren. – wildplasser
Wenn dies der Fall ist, warum bekomme ich nach dem Beenden meines Programms mit SIGINT/segfault "Gerät oder Ressource beschäftigt", wenn ich versuche, das Programm erneut zu öffnen? Ich sehe diesen Fehler nicht, wenn ich ihn sauber verlasse und ihn wieder öffne. – Dave
Ich kenne Ihren Code nicht. Vielleicht haben Sie den falschen Wert für den Bufcount? Vielleicht haben Sie keine der notwendigen Funktionen implementiert? – wildplasser