Hãy tưởng tượng hai quá trình, một người đọc và một người viết, giao tiếp qua một tệp thông thường trên một ext3 fs. Reader có một IN_MODIFY
đồng hồ inotify trên tập tin. Nhà văn ghi 1000 byte vào tệp, trong một write()
cuộc gọi. Reader nhận được sự kiện inotify và gọi fstat
trên tệp. Reader thấy gì?
Có đảm bảo rằng Reader sẽ lấy lại ít nhất 1000 cho
st_size
tệp không? Từ thí nghiệm của tôi, có vẻ như không.Có đảm bảo rằng Reader thực sự có thể
read()
1000 byte không?
Điều này đang xảy ra trên một hộp ràng buộc I / O nghiêm trọng. Ví dụ: sar
hiển thị thời gian chờ khoảng 1 giây. Trong trường hợp của tôi, Reader thực sự đang đợi 10 giây SAU KHI nhận được sự kiện inotify trước khi gọistat
và nhận được kết quả quá nhỏ.
Những gì tôi đã hy vọng là sự kiện inotify sẽ không được gửi cho đến khi tập tin đã sẵn sàng. Điều tôi nghi ngờ đang thực sự xảy ra là sự kiện inotify kích hoạt DURING write()
cuộc gọi trong Nhà văn và dữ liệu thực sự có sẵn cho các quy trình khác trên hệ thống bất cứ khi nào nó sẵn sàng. Trong trường hợp này, 10 giây là không đủ thời gian.
Tôi đoán tôi chỉ đang tìm kiếm xác nhận rằng hạt nhân thực sự thực hiện inotify theo cách tôi đoán. Ngoài ra, nếu có bất kỳ lựa chọn, có thể, để thay đổi hành vi này?
Cuối cùng- điểm gây bất lực là gì, đưa ra hành vi này? Dù sao bạn cũng được giảm việc bỏ phiếu cho tập tin / thư mục, sau khi bạn nhận được sự kiện, cho đến khi dữ liệu thực sự có sẵn. Cũng có thể làm điều đó suốt, và quên đi việc bị kích thích.
*** BIÊN TẬP ** * * Được rồi, như thường xảy ra, hành vi tôi đang thấy thực sự có ý nghĩa, bây giờ tôi hiểu những gì tôi đang làm. ^ _ ^
Tôi thực sự đang phản hồi một sự kiện IN_CREATE trên thư mục mà tệp đang tồn tại. Vì vậy, tôi thực sự là stat () 'trong tệp để đáp ứng với việc tạo tệp, không nhất thiết là sự kiện IN_MODIFY, có thể đến sau.
Tôi sẽ thay đổi mã của mình để sau khi nhận được sự kiện IN_CREATE, tôi sẽ đăng ký IN_MODIFY trên chính tệp đó và tôi sẽ không thực sự cố đọc tệp cho đến khi tôi nhận được sự kiện IN_MODIFY. Tôi nhận ra rằng có một cửa sổ nhỏ trong đó tôi có thể bỏ lỡ ghi vào tệp, nhưng điều này có thể chấp nhận được đối với ứng dụng của tôi, vì trong trường hợp xấu nhất, tệp sẽ bị đóng sau một số giây tối đa.