Sự khác biệt sử dụng giữa các tập tin thiết bị, ioctl, sysfs, netlink


12

Tôi đang cố gắng làm rõ phương thức nào hữu ích nhất (về chức năng) để tương tác với các thiết bị trong Linux. Theo tôi hiểu, các tệp thiết bị chỉ hiển thị một phần chức năng (khối địa chỉ trong thiết bị khối, luồng trong thiết bị ký tự, v.v ...). ioctl(2)dường như được sử dụng phổ biến nhất, nhưng một số người nói rằng nó không an toàn, v.v.

Một số bài viết tốt hoặc con trỏ liên quan khác sẽ được hoan nghênh.

Câu trả lời:


9

ioctlcó xu hướng đi đôi với một /devmục; mã thông thường của bạn sẽ làm

fd=open("/dev/mydevice",O_RDRW);
ioctl(fd,.....);

Đây là hành vi Unix tiêu chuẩn hoàn hảo. Bên trong trình điều khiển hạt nhân, bạn có thể đặt các điều khiển truy cập (ví dụ: chỉ rootcó thể thực hiện một số điều hoặc yêu cầu một khả năng cụ thể để truy cập chi tiết hơn), điều này làm cho nó khá linh hoạt và mạnh mẽ.

Tất nhiên, điều này có nghĩa là các thiết bị có thể phơi bày nhiều hơn so với sử dụng hoạt động đọc-ghi khối / ký tự; nhiều thứ có thể được thực hiện thông qua ioctlcác cuộc gọi. Không dễ dàng như vậy để sử dụng từ kịch bản shell, nhưng khá dễ dàng từ Choặc perlhoặc pythonhoặc tương đương.

sysfscác mục là một cách khác để tương tác với trình điều khiển. Thông thường mỗi loại lệnh sẽ có một mục khác nhau, do đó có thể phức tạp khi viết trình điều khiển nhưng nó giúp bạn dễ dàng truy cập qua không gian người dùng; tập lệnh shell đơn giản có thể thao tác nhiều thứ, nhưng có thể không hiệu quả lắm

netlinkchủ yếu tập trung (tôi nghĩ vậy!) vào việc truyền dữ liệu mạng, nhưng nó có thể được sử dụng cho những thứ khác. Nó thực sự tốt cho khối lượng truyền dữ liệu lớn hơn và có nghĩa là một sự kế thừa ioctltrong một số trường hợp.

Tất cả các tùy chọn đều tốt; trường hợp sử dụng của bạn có thể xác định loại giao diện nào sẽ lộ ra từ trình điều khiển của bạn.


1
Thêm nhiều thứ để gây nhầm lẫn: "ioctl: Tuy nhiên, ioctl không được dùng trong kernel và bạn sẽ khó có được trình điều khiển nào với việc sử dụng ioctl mới được chấp nhận ngược dòng. Các trình duy trì kernel không thích ioctl vì nó làm cho mã kernel và mã ứng dụng quá phụ thuộc và thật khó để giữ cả hai cùng bước qua các phiên bản và kiến ​​trúc kernel. " [Trang 255] "Làm chủ lập trình Linux nhúng" của Chris Simmonds [2017].
Israr

Điều này nối thêm một câu hỏi: Sau đó chúng ta có thể truy cập sysfs từ C không?
Israr
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.