Nó chỉ ra toàn bộ sự hiểu lầm của mở() so với fopen() bắt nguồn từ trình điều khiển I2C lỗi trong hạt nhân Linux 2.6.14 trên ARM. Quay trở lại một trình điều khiển bit bashed làm việc giải quyết nguyên nhân gốc rễ của vấn đề tôi đã cố gắng để giải quyết ở đây.Làm thế nào bạn có thể xóa một ghi bằng cách sử dụng một bộ mô tả tập tin?
Tôi đang cố gắng tìm ra sự cố với trình điều khiển thiết bị nối tiếp trong Linux (I2C). Nó xuất hiện rằng bằng cách thêm tạm thời hệ điều hành tạm dừng (ngủ) giữa viết và đọc trên thiết bị những thứ làm việc ... (nhiều) tốt hơn.
Ngoài: Bản chất của I2C là mỗi byte đọc hoặc bằng văn bản của tổng thể được thừa nhận bởi các thiết bị ở đầu bên kia của dây (nô lệ) - tạm dừng việc cải thiện điều khuyến khích tôi phải suy nghĩ của tài xế làm việc không đồng bộ - thứ mà tôi không thể hòa giải với cách hoạt động của xe buýt. Anyhoo ...
tôi muốn hoặc như để tuôn write để chắc chắn (hơn là sử dụng tạm dừng thời gian cố định), hoặc bằng cách nào đó kiểm tra xem ghi/giao dịch đọc đã hoàn thành theo cách thân thiện với nhiều luồng.
Vấn đề với việc sử dụng fflush(fd);
là nó đòi hỏi 'fd' là dòng con trỏ (không phải là một mô tả tập tin) tức là
FILE * fd = fopen("filename","r+");
... // do read and writes
fflush(fd);
Vấn đề của tôi là tôi yêu cầu sử dụng của ioctl()
, mà không làm sử dụng một con trỏ dòng. tức là
int fd = open("filename",O_RDWR);
ioctl(fd,...);
Gợi ý?
Trong mã vùng người dùng, hàm write() tự động không được đệm. Bạn không cần phải tuôn ra nó - nó là tự xả. Thật vậy, trừ khi bạn sử dụng các cuộc gọi hệ thống đặc biệt, nó cũng đồng bộ với trình điều khiển thiết bị. –
Nếu bạn đang viết một mô-đun cấp hạt nhân, các quy tắc có thể hơi khác nhau, nhưng sau đó bạn có lẽ nên sử dụng mô tả tập tin i/o và không chuẩn (con trỏ tập tin) i/o. –