2009-08-10 17 views
5

Ở mức độ khá cao trong hàm linux write(), nó lọc ra các yêu cầu để viết bộ đệm độ dài 0. Điều đó có ý nghĩa. Ai muốn hệ điều hành lãng phí đó là thời gian khoan qua các lớp chỉ để xác định không có công việc phải làm?Hậu quả của việc gọi write() với độ dài bằng 0 là bao nhiêu?

Vâng ... tôi.

Nó liên quan đến điều này question; và phát hiện ra rằng trình điều khiển I2C bit-banged sẽ cung cấp một mã trả về có khả năng hữu ích nếu địa chỉ (được gửi trên xe buýt trước dữ liệu) sẽ đưa ra một lỗi nếu việc bắt tay sai.

Người ta có thể gửi dữ liệu giả sau địa chỉ, nhưng không được gửi bằng thiết bị tôi đang sử dụng. (Có lẽ tôi sẽ thử đọc ...).

Vì vậy, câu hỏi là: Loại địa ngục nào sẽ được giải phóng nếu hạt nhân cho phép ghi số không (0)?

Trả lời

2

Chỉ vì mục đích đóng cửa, tôi sẽ làm theo ý tưởng của Warren Young về việc cập nhật trình điều khiển và xuất bản bản vá (khi tôi nhận được vòng tuit).

+0

Và điều này sẽ giúp phần còn lại của chúng ta cuối cùng. Cảm ơn bạn –

0

không phải là một câu trả lời nghiêm túc: bạn có thể nhận được một chương trình như touch: P

1

Rất ít, tôi nghĩ - nó có thể là có thể là một zero-chiều dài ghi sẽ chặn nếu bộ đệm nó bằng văn bản cho không có sẵn khoảng trống, trong một số trình điều khiển. Việc không cho phép ghi độ dài bằng 0 có thể làm cho mọi thứ trở nên đơn giản hơn trong các trường hợp như vậy - cũng như tránh được rất nhiều công việc lãng phí.

Tại sao không chỉ loại bỏ kiểm tra đó và xem loại địa ngục nào thực sự bị mất? :)

5

Những gì bạn mô tả số lượng về cơ bản cùng một loại ác gây hại cho một số API Windows cần số lượng bộ nhớ không thể đoán trước. Thực tế là để gọi cho họ không có bộ đệm để đặt công việc của họ, họ làm công việc anyway, mà không lưu trữ kết quả, nhưng đếm số byte họ cần trên đường đi. Sau đó, bạn cấp phát một bộ đệm có kích thước đó và gọi hàm lại với bộ đệm, biết kích thước.

Đây là điều không thể miêu tả được. Đó là lập trình máy tính tương đương với bộ máy quan liêu bị hư hỏng, nơi mỗi bộ phận yêu cầu bạn điền vào một mẫu có hầu hết thông tin giống như thông tin bạn đã cung cấp cho bộ phận trước, nhưng vì có một số thông tin khác nhau trên mỗi biểu mẫu, họ sẽ không chỉ lấy một bản sao của mẫu mà bạn đã cho những kẻ khác. Ptui!

Thời gian lập trình tốn kém, thời gian CPU là rẻ. Yêu cầu các lập trình viên viết cùng một cuộc gọi API N lần để tạo ra một số trạng thái thế giới rằng bản thân API có thể làm việc trên những cố gắng riêng của nó để lật cái này lên đầu nó.

Thực tiễn tốt nhất, sau đó, là yêu cầu trình điều khiển làm mọi thứ có thể để đảm bảo rằng bạn viết() thành công. Nếu nó có thể dự đoán trước rằng nó không thể thành công bằng cách kiểm tra một số trạng thái của thế giới, có lẽ đó phải là một ioctl().

+0

Các giải pháp phần cứng +1 thuộc về hạt nhân ... nhưng nếu không, và đây là hạt nhân rất cũ (không bị mờ), thì có thể hợp lý để giải quyết trong không gian người dùng. – bdonlan

+0

Nhưng trong trường hợp này tôi không thực sự muốn viết - vì vậy các cửa sổ tương tự không được áp dụng. Tôi _really_ muốn 'viết' không byte. Nếu không, tôi sẽ thay đổi API bằng cách thêm các cuộc gọi ioctl độc quyền vào trình điều khiển được thiết lập. – Jamie

+3

Tôi không nghĩ bạn * nên * thêm một cuộc gọi độc quyền cho người lái xe. Tôi nghĩ rằng bạn nên chỉ hành vi này ra cho người duy trì trình điều khiển đó, và yêu cầu họ cho - hoặc cung cấp cho họ một bản vá cho - phơi bày chức năng này. Nó có thể được gọi là hàm I2C_PING. ioctls() là một cách để làm điều này./proc và sysctl là những người khác. –

0

Tôi rùng mình để đề xuất ioctl() nhưng đó không phải là giao diện tốt hơn để có được thông tin trạng thái về giao diện không?

0

Ghi có độ dài bằng 0 có nghĩa là gì? Nói chung, viết có nghĩa là chuyển dữ liệu ... và tôi chắc chắn nhiều vấn đề hơn sẽ được gây ra do không kiểm tra cho nó và do đó bắt được nhiều đầu vào xấu cho trình điều khiển.y

nếu đó là một bit thông tin "thực hiện việc này", hãy gọi cho bạn sau, tôi nghĩ ioctl là cách để đi. Nó không đẹp, nhưng bạn có thể làm gì?

Hoặc, hãy chọn tùy chọn hạt nhân, sử dụng mmap() và di chuyển toàn bộ thứ đó vào không gian người dùng. Chi phí thấp, và bạn có thể viết mã poke cổ điển như "viết X vào thanh ghi này" mà hầu như có vẻ như đó là những gì bạn cần.