Tôi có trình điều khiển thiết bị nhân vật Linux tạo mục nhập /dev/mything
và sau đó là chương trình C++/Qt mở thiết bị và sử dụng thiết bị. Nếu chương trình đó thoát đúng cách, với exit()
, thiết bị sẽ đóng và trình điều khiển sẽ tự đặt lại chính xác. Nhưng nếu chương trình thoát bất thường, thông qua segfault hoặc SIGINT
hoặc một cái gì đó, thiết bị không được đóng đúng cách.Trình điều khiển thiết bị nhân vật Linux có thể phát hiện ra như thế nào khi chương trình sử dụng nó thoát bất thường?
Giải pháp hiện tại của tôi là tải lại trình điều khiển nếu nó bị kẹt trong trạng thái "mở".
dòng trong trình điều khiển này sẽ cố gắng để ngăn chặn nhiều chương trình sử dụng các thiết bị cùng một lúc:
int mything_open(struct inode* inode, struct file* filp) {
...
if (port->rings[bufcount].virt_addr) return -EBUSY;
...
}
Sau đó này làm sạch nó lên:
int mything_release(struct inode* inode, struct file* filp) {
...
port->rings[bufcount].virt_addr = NULL;
...
}
Tôi nghĩ exit()
đang gây ra mything_release
được gọi nhưng SIGINT
không phải là. Làm thế nào tôi có thể làm cho người lái xe mạnh mẽ hơn đối với loại tình huống này?
EDIT:
Dưới đây là các hoạt động tôi đã triển khai. Có lẽ tôi đang thiếu một cái gì đó?
static struct file_operations fatpipe_fops = {
.owner = THIS_MODULE,
.open = mything_open,
.release = mything_release,
.read = mything_read,
.write = mything_write,
.ioctl = mything_ioctl
};
Khi các proces thoát hoặc bị chấm dứt, hạt nhân sẽ giải phóng tài nguyên. Bao gồm số lượng tham chiếu trên bất kỳ phần mô tả tệp mở nào. – wildplasser
Nếu đó là trường hợp, tại sao sau khi chương trình của tôi chấm dứt với SIGINT/segfault, tôi nhận được 'Thiết bị hoặc tài nguyên bận 'khi tôi cố gắng mở lại chương trình? Tôi không thấy lỗi đó nếu tôi thoát khỏi nó một cách sạch sẽ và mở lại nó. – Dave
Tôi không biết mã của bạn. Có lẽ bạn có giá trị sai cho bufcount? Có lẽ bạn đã không thực hiện một trong những chức năng cần thiết? – wildplasser