2013-03-05 41 views
5

Tôi đã chỉnh sửa ví dụ here để làm cho liên tục xem tệp để 'sửa đổi'. Mã của tôi là here. Trong các thử nghiệm của tôi, thông báo inotify chỉ kích hoạt lần đầu tiên tệp được 'sửa đổi' (tức là touch 'ed). Mọi sửa đổi tiếp theo đối với tệp sẽ không gây ra bất kỳ thông báo nào để kích hoạt. stat cho thấy thời gian 'Sửa đổi' đã thay đổi. Ngoài ra, sửa đổi mã để xóa đồng hồ và thêm lại mỗi khi có thông báo cháy (tức là di chuyển inotify_add_watchinotify_rm_watch để nằm trong vòng while(1) trong số sample) của tôi không giúp giải quyết vấn đề này.inotify không kích hoạt thông báo về sửa đổi tệp

Tôi đã tự hỏi nếu có ai ở đây có thể giúp đỡ những gì tôi có thể làm sai. Ngoài ra, mặc dù tôi đã thêm đồng hồ cho IN_ALL_EVENTS, tôi thực sự chỉ quan tâm đến các sự kiện IN_MODIFY. Không chắc chắn nếu điều đó làm cho bất kỳ sự khác biệt.

Ngoài ra, trường hợp sử dụng này có hoạt động không? Tôi có nên thay đổi cách tiếp cận của mình để xem thư mục thay thế không? Làm ơn cho lời khuyên.

TIA.

Chỉnh sửa 1: Như được ghi chú bởi themel, việc xử lý i cần một số sửa chữa. Tuy nhiên ngay cả phiên bản cố định cũng không kích hoạt các thông báo cho các sự kiện hệ thống tập tin tiếp theo. Ngoài ra, việc thêm một chiếc đồng hồ trên thư mục trái ngược với tập tin sẽ thể hiện hành vi không xác định tương tự.

Chỉnh sửa 2: Tôi muốn nhận được điều này asio + inotify example dựa trên this answer để hoạt động. Thật không may là ví dụ đã không được làm việc cho tôi cả. Bất kì sự trợ giúp nào đều được đánh giá cao. TIA.

Trả lời

2

Sau khi khắc phục sự cố, mã của bạn hoạt động tốt khi xem thư mục, trong các thử nghiệm của tôi. Khi xem tệp, event->len bằng 0 và mã của bạn bỏ qua các thông báo.

Với thử nghiệm cho event->len bị xóa và tất cả event->name được thay thế bằng file_path trong báo cáo printf, nó cũng hoạt động tốt khi xem tệp.

PS: Chỉ cần chú ý bạn đề cập đến touch.

touch gửi các sự kiện sau đây:

IN_OPEN 
IN_ATTRIB 
IN_CLOSE_WRITE 

không IN_MODIFY

Ngoài ra, không kiểm tra sửa đổi bằng cách chỉnh sửa nó với vim như tôi chỉ làm - nó xóa các tập tin trong khi xáo trộn các bản sao làm việc và trao đổi, loại bỏ đồng hồ. pico hoạt động.

+0

Mặc dù tôi tự hỏi tại sao 'touch' không gây ra thông báo' IN_MODIFY'. 'stat' dường như gợi ý' touch' đã sửa đổi thời gian 'Sửa đổi' của tệp. –

2

Việc xử lý i của bạn bị hỏng, bạn không bao giờ đặt lại thành 0 trong vòng lặp. Điều này gây ra bất kỳ sự kiện inotify sau này để được xem xét chỉ khi họ được lâu hơn sự kiện dài nhất trước khi họ, mà không phải là những gì bạn muốn.

Fixed version.

+0

Bạn nói đúng. Việc xử lý 'i' chắc chắn đã bị hỏng - cảm ơn vì đã bắt được nó. Tuy nhiên ngay cả các phiên bản cố định dường như bỏ lỡ thông báo sau này (sau khi đám cháy thông báo đầu tiên).Bất kỳ suy nghĩ về việc sửa lỗi này? –

+0

Hm, tôi vẫn nhận được sự kiện inotify với mã đó (nhưng không có điều kiện nào của bạn bị cháy vì a) khi xem từng tệp, tên sự kiện-> sẽ luôn trống và b) chạm sẽ cung cấp cho bạn sự kiện IN_ATTRIB, không phải IN_MODIFY). – themel

0

khi theo dõi sự kiện tệp riêng lẻ-> len sẽ bằng 0 vì tên tệp không được trả lại. Tôi nhận thấy rất nhiều các chương trình ví dụ có vấn đề này.

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