2010-11-01 26 views
5

Bạn có thể giải thích cho tôi cơ chế thông báo không? Tôi đã tìm kiếm trên web về nó, nhưng điều tôi hiểu là nếu tôi muốn xem các thay đổi trong một tệp, tôi phải thực hiện bỏ phiếu với chức năng “đọc”. Có chức năng gọi lại nào sẽ thông báo cho tôi khi tệp có thay đổi mà không cần bỏ phiếu không?linux, inotify - cách đăng ký?

Xin cảm ơn,

Trả lời

0

Không, inotify yêu cầu bỏ phiếu.

Đăng ký gọi lại bằng tín hiệu (như được đề xuất), IMO tệ hơn sau đó thực hiện bỏ phiếu thông thường.

+0

Lưu ý đúng, nhưng bạn có thể giải thích * tại sao nó sẽ tồi tệ hơn? :) –

+1

@ Frédéric Hamidi Một vấn đề với tín hiệu là chúng không kết hợp rất tốt với các ngoại lệ. Vấn đề thứ hai là các trình xử lý tín hiệu nên làm công việc tối thiểu nhất có thể và trả về. –

+2

Chỉ khi bạn thông qua ngoại lệ từ trình xử lý tín hiệu. Và thực tế là các bộ xử lý tín hiệu nên làm công việc tối thiểu nhất có thể không có nghĩa là việc bỏ phiếu được ưu tiên. Ví dụ: mã chính của bạn có thể tạo đường ống, thiết lập trình xử lý tín hiệu, sau đó chọn trên đường ống. Trình xử lý tín hiệu ghi một ký tự đơn vào đường ống rồi thoát ra. viết là an toàn-tín hiệu-an toàn. Kiểm soát trở về mã chính của bạn và chọn trả về. Bạn có một trình xử lý tín hiệu tối thiểu và không cần phải bỏ phiếu. – atomice

2

Tôi đang suy đoán rằng bạn đang sử dụng một số thư viện GUI xử lý sự kiện cho bạn.

Thư viện GUI tốt hơn có cách để xem các bộ mô tả tệp. Trong GTK, nó là gtk_input_add_full; trong Qt, QSocketNotifier có thể phù hợp với bạn.

+1

Cố định các liên kết cho bạn, với đại diện nhiều hơn một chút, bạn sẽ không gặp vấn đề gì khi tự thêm chúng. –

1

Cuộc gọi inotify sử dụng các trình mô tả tệp. Thay vì bỏ phiếu, bạn có thể sử dụng các FD được trả về trong nhóm cuộc gọi select(). Nó không chính xác một chức năng gọi lại nhưng làm giảm chi phí mà bạn quan tâm.

1

Bạn có thể sử dụng phần ev_io của thư viện libev. Điều này sẽ cho phép bạn thiết lập một cuộc gọi lại khi fd inotify có thể đọc được.

Tài liệu cho libev có thể được tìm thấy tại đây: http://pod.tst.eu/http://cvs.schmorp.de/libev/ev.pod

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