2009-12-27 29 views
13

Rõ ràng là nói chung cuộc gọi hệ thống đọc (2) có thể trả lại ít byte hơn so với yêu cầu được đọc. Tuy nhiên, một vài chương trình giả định rằng khi làm việc với một tệp cục bộ, đọc (2) không bao giờ trả về ít hơn những gì được yêu cầu (trừ khi tệp ngắn hơn, dĩ nhiên). Vì vậy, câu hỏi của tôi là: trên Linux, trong trường hợp này có thể đọc (2) trả về ít hơn những gì được yêu cầu nếu đọc từ một tập tin mở và EOF không gặp phải và số tiền được đọc tối đa là vài kilobyte?"đọc ngắn" từ hệ thống tệp, khi nào nó có thể xảy ra?

Một số dự đoán:

  • có thể nhận được tín hiệu gián đoạn đọc như thế, nhưng không làm cho nó thất bại?
  • Hệ thống tệp khác nhau có ảnh hưởng đến hành vi này không? Có điều gì đặc biệt về jffs2 không?
+0

Chương trình nào "giả định rằng khi làm việc với một tệp cục bộ, đọc (2) không bao giờ trả về ít hơn số được hỏi"? Trong trường hợp chung, điều đó nghe có vẻ giống như một con bọ. – Ken

+0

Ví dụ, fstype binary trong klibc utils. Có vẻ như nhiều chương trình cấp thấp có thể giả định làm việc với các tệp trực tiếp giả định rằng lần đọc không bao giờ ngắn. – Nakedible

Trả lời

13

POSIX.1-2008 states:

Giá trị trả lại có thể ít hơn nbyte nếu số lượng byte còn lại trong file nhỏ hơn nbyte, nếu yêu cầu read() là bị gián đoạn bởi tín hiệu hoặc nếu tệp là đường ống hoặc FIFO hoặc tệp đặc biệt và có ít hơn hơn nbyte bytes ngay lập tức có sẵn để đọc.

Hệ thống tệp dựa trên đĩa thường sử dụng lần đọc liên tục, có nghĩa là hoạt động đọc thường không thể bị gián đoạn bởi tín hiệu. Các hệ thống tập tin dựa trên mạng đôi khi sử dụng các lần đọc gián đoạn, có thể trả về một phần dữ liệu hoặc không có dữ liệu. (Trong trường hợp của NFS, cấu hình này có thể được định cấu hình bằng tùy chọn gắn kết intr.) Đôi khi, chúng cũng thực hiện hết thời gian chờ.

Hãy nhớ rằng ngay cả/một số/tùy ý/tệp/đường dẫn có thể tham chiếu đến tệp FIFO hoặc đặc biệt, vì vậy những gì bạn cho là một tệp thông thường có thể không có.Do đó, thực hành tốt để xử lý đọc một phần mặc dù chúng có thể không xảy ra.

+1

Cảm ơn bạn. Nếu điều này là chính xác, sau đó điều này chúng tôi có một số gỡ lỗi nhiều hơn để làm. Chúng tôi đang nhận được một xác nhận ngắn đọc trên một hệ thống tập tin jffs2 (mà không nên có lần đọc gián đoạn tôi đoán), và tập tin chắc chắn là một tập tin thường xuyên. Tình hình xảy ra nhiều nhất mỗi năm một lần, vì vậy khả năng tái tạo thấp. – Nakedible

+1

Hệ thống tệp được _allowed_ làm gián đoạn bản thân đọc sau khi đọc một khối. – Joshua

1

Tín hiệu đã nhận chỉ làm cho read() thất bại nếu nó chưa đọc một byte đơn. Nếu không, nó sẽ trả về một phần dữ liệu.

Và tôi đoán các hệ thống tệp thay thế thực sự có thể trả về các lần đọc ngắn trong các tình huống khác. Ví dụ, nó làm cho một số ý nghĩa (với tôi) để có một hệ thống tập tin dựa trên mạng hoạt động giống như một ổ cắm mạng wrt ngắn đọc (= có chúng thường xuyên).

+0

Cảm ơn, điều này rất hữu ích! Mặc dù thông tin về các hệ thống tệp gián đoạn và không gián đoạn thậm chí còn hữu ích hơn. – Nakedible

3

Tôi phải hỏi: "tại sao bạn quan tâm đến lý do"? Nếu đọc có thể trả lại một số byte nhỏ hơn số tiền được yêu cầu (mà, như bạn chỉ ra, nó chắc chắn có thể) tại sao bạn không muốn đối phó với tình huống đó?

+0

Để thêm, bạn sẽ kiểm tra dữ liệu anyways - vì vậy nếu nó là ngắn, bạn sẽ biết ngay lập tức. Nếu không, lý do khác để đọc là gì? –

+9

Neil, tôi phải hỏi: tại sao bạn quan tâm tại sao anh ta muốn biết làm thế nào điều này có thể xảy ra? Ngay cả khi anh ta giải quyết tình huống này, vẫn rất hữu ích khi biết nó có thể xảy ra như thế nào, ví dụ: để anh ấy có thể thử nó và kiểm tra xem mã của anh ấy có xử lý nó như mong đợi không. Và nếu nó không phải là mã cá nhân của riêng mình mà không xử lý trường hợp này, thông tin này sẽ là cần thiết như là một phần của các hướng dẫn để tái tạo các vấn đề cần đi kèm với bất kỳ báo cáo lỗi hoặc gửi bản vá. – mark4o

+0

Lý do tôi hỏi là chúng ta đang thấy hành vi này trên cơ sở được cài đặt của hàng nghìn hệ thống và chúng ta cần phải đánh giá chính xác nhất mức độ thường gặp của vấn đề này trong thời gian dài. Hiểu cách thức hoặc lý do xảy ra là một phần của cuộc điều tra. – Nakedible

1

Nếu đó thực sự là một tệp bạn đang đọc, thì bạn có thể đọc ngắn dưới dạng lần đọc cuối cùng trước khi kết thúc tệp.

Làm thế nào, thường là cách tốt nhất để xử lý như thể BẤT K read có thể đọc được phần nào đọc ngắn. Nếu những gì bạn đang đọc là một đường ống hoặc một thiết bị đầu vào (stdin) chứ không phải là một tệp, bạn có thể đọc một đoạn ngắn bất cứ khi nào bộ đệm của bạn lớn hơn bộ đệm hiện tại.

+0

Điều tôi ngụ ý khi không gặp phải EOF chính xác là nó không phải là lần đọc cuối cùng trước khi kết thúc tệp. Ngoài ra, tệp được đề cập là một tệp thông thường. – Nakedible

0

Tôi không chắc chắn nhưng tình huống này có thể phát sinh khi hệ điều hành hết các trang trong bộ nhớ cache của trang. Bạn có thể đề nghị rằng thread flush sẽ được gọi trong trường hợp đó, nhưng nó phụ thuộc vào heuristic được sử dụng trong I/O scheduler. Tình trạng này có thể gây ra một đọc để trả về ít byte hơn.

Các vấn đề liên quan